【问题标题】:Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time消息:ini_set():会话处于活动状态。您目前无法更改会话模块的 ini 设置
【发布时间】:2015-12-25 05:12:52
【问题描述】:

我用 codeigniter 创建了一个登录页面,但我收到了 php 消息。

Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time

如何解决这个问题?

查看(login.php)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Admin Login</title>
<link rel="stylesheet" href="../css/normalize.css">
<link rel="stylesheet" href="../css/admin-style.css">
</head>
<body>
    <?php echo form_open('Verify_login', ['id'=>'loginForm', 'name'=>'loginForm', 'method'=>'post']) ?>
    <div class="login">
        <div class="log-box">
            <h3>Login</h3>
            <div >
                  <input id="username" name="username" placeholder="User Name" value="" type="text" >
                <?php echo form_error('username'); ?>
                <input id="Password" name="password" placeholder="Password" required type="password">
                <?php echo form_error('password'); ?>
                <div class="remember-me">
                    <input id="checkBox" type="checkbox">
                    <label for="checkBox">Remember Me</label>
                </div>
                <button class="login-button" name="loginButton">Login</button>
            </div>
        </div>
    </div>
 </form>
</body>
</html>

控制器 (Verify_login.php)

<?php 
defined('BASEPATH') OR exit('No direct script access aloowed');

class Verify_login extends CI_Controller
{

public function __construct()
{
    parent::__construct();
    $this->load->model('User');
    $this->load->helper('url');
    $this->load->helper('security');
    $this->load->library('form_validation');
    $this->load->library('session');
}

public function index()
{
    $this->form_validation->set_rules('username', 'Username', 'trim|required');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|callback_check_database');
    if ($this->form_validation->run() == FALSE) {
        // if validation failed load the view 
        $this->load->view('admin/login');
    }

    else{
        $this->check_database($username , $password);
        redirect('dashboard', 'refresh');
    }
}

public function check_database($password)
{
    $username = $this->input->post('username');

    //query tha database
    $result = $this->User->login($username, $password);

    if ($result) {
        $sess_array = [];
        foreach ($result as $row) {
            $sess_array = 
                [
                    'id'=>$row->id,
                    'username'=>$row->name
                ];
            $this->session->set_userdata('logged_in', $sess_array);
        }
        return TRUE;
    }
    else{

        $this->form_validation->set_message('check_database','invalid username and password');
    }
  }
 }
?>

控制器(Admin.php)

session_start(); //need to call PHP's session object to access it though it
class Admin extends CI_Controller
{

public $data;
public function __construct()
{
    parent::__construct();
    $this->load->helper('url');

    $this->load->helper('form');
    $this->load->helper('url');
    $this->load->library('form_validation');
    $this->load->helper('security');

    //load user model
    $this->load->model('User');

}
public function index()
{
    // $this->load->view('admin/index');
    if ($this->session->userdata('logged_in')) {

        $session_data = $this->session->userdata('logged_in');
        $data['username'] = $session_data['name'];
        $this->load->view('admin/dashboard', $data);
    }
    else{

        //if no session redirect to login page 
        redirect('admin', 'refresh');
        // redirect('login');
    }
}

public function logout()
{
    $this->session->unset_userdata('logged_in');
    session_destroy();
    redirect('home', 'refresh');
}

模型(User.php)

<?php 

/** *扩展 MY_Model 的用户登录类 * */

defined('BASEPATH') OR exit('no direct script allowed');

class User extends CI_Model
{
    protected $table = 'users';

    public function __construct()
    {
        $this->load->database();
    }

    public function login($username ,$password)
    {
        var_dump($username);
        var_dump($password);
        $this->db->select(['id', 'name', 'password']);
        $this->db->from($this->table);
        // $this->db->where('name', $username);
        // $this->db->where('password', $password);
        $this->db->limit(1);

        $query = $this->db->get();
        if ($query->num_rows() == 1) {
            return $query->result();
        }
        else{

            return false;
        }
    }
   }    
   ?>

【问题讨论】:

  • 请提供一些代码或提供您尝试过的东西。此消息表示您正在尝试在 session_start 之后更改会话模块设置
  • 检查 phpinfo() 看你的配置是否设置了 session.auto_start?
  • 确定 session.auto_start 关闭。

标签: php codeigniter session apache2


【解决方案1】:

admin.php

中不需要此行
session_start(); //need to call PHP's session object to access it though it

当您加载会话库时,其构造函数会为您执行此操作。

【讨论】:

  • 用户可能关注了一些基于 pre CI3 版本的示例。在将我的 CI2 项目升级到 CI3 时,我也遇到了这个错误
  • @BiLaL 我认为在上课前排个队不是最佳做法。如果需要,您可以在课堂上使用 constructors
  • 是的,我完全同意你的看法,这不是最佳做法。 php 不是我的域,我也有这样的例子,它在 CI2 中工作。在 .NET 中甚至不接受这样的声明
  • 为什么 CI 3 在调用新方法后会丢失会话?
【解决方案2】:

该消息意味着您已经与session_start() 开始了一个会话,在代码的更下方,您正在使用ini_set() 来操作会话模块。如果您正在操作会话模块,则应在会话开始并处于活动状态之前完成。

【讨论】:

  • 或者换句话说:Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time
【解决方案3】:

消息:ini_set():会话处于活动状态。您目前无法更改会话模块的 ini 设置

我之前有同样的错误信息,默认情况下,Code-igniter 将写入文件 (C:\xampp\tmp)。但我希望它改为写入数据库。

在你的自动加载器中,你可能有这样的东西:

//:::::$autoload['libraries'] = array();
//'session', this mean start session ini_set()
$autoload['libraries'] = array('session', 'database');

在 config/config.php 会话配置中的默认设置如下所示:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

documentation 声明要使用数据库而不是文件,您应该首先在应用程序数据库中创建一个表。

CREATE TABLE IF NOT EXISTS `ci_sessions` (
        `id` varchar(128) NOT NULL,
        `ip_address` varchar(45) NOT NULL,
        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
        `data` blob NOT NULL,
        KEY `ci_sessions_timestamp` (`timestamp`)
);

回到config/config.php,把$config['sess_driver'] = 'files';改成$config['sess_driver'] = 'database';

就像这样,我认为一切都应该没问题,但我收到错误 Message: ini_set(): A session is active。您目前无法更改会话模块的 ini 设置

我的解决方案是首先运行session_destroy();

然后更改会话名和表名

我的配置如下所示:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'newname_session';
$config['sess_expiration'] = 72000;
$config['sess_save_path'] ='newname_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

保存所有内容,刷新页面后全部清除,不显示错误消息

【讨论】:

    【解决方案4】:

    这真的很适合我

    if (!isset($_SESSION)) {
    
    // server should keep session data for AT LEAST 24 hour
    ini_set('session.gc_maxlifetime', 60 * 60 * 24);
    
    // each client should remember their session id for EXACTLY 24 hour
    session_set_cookie_params(60 * 60 * 24);
    session_start();
    }
    

    所以你确实在调用 ini_set 和 session_set_cookie_params 等之后开始你的会话

    【讨论】:

      【解决方案5】:

      这对我有用:

      if (!isset($_SESSION)) {
         // server should keep session data for AT LEAST 24 hour
         ini_set('session.gc_maxlifetime', 60 * 60 * 24);
      
         session_start();
      
         // each client should remember their session id for EXACTLY 24 hour
         session_set_cookie_params(60 * 60 * 24);
      }
      

      【讨论】:

        【解决方案6】:

        您可以通过仅在需要时运行命令来解决此问题,如下所示:

        if (!isset($_SESSION)
            && !headers_sent()
        ) {
            session_start();
        }
        

        【讨论】:

          【解决方案7】:
          1. 转到文件 \system\libraries\Session\Session。
          2. 取消注释第 143 行的 session_start() 即可完成。

          【讨论】:

          • 请考虑更详细地解释您的答案,以便 OP 能够理解
          • 我建议不要这样做,因为您正在修改系统文件,如果更新代码库,这些文件可能会被删除。最佳做法是更改应用程序文件(例如 admin.php),如之前的答案中所述。
          猜你喜欢
          • 1970-01-01
          • 2012-11-12
          • 2020-04-26
          • 2012-11-19
          • 1970-01-01
          • 2015-05-21
          • 2020-05-31
          • 2020-07-14
          • 2018-05-21
          相关资源
          最近更新 更多