Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter 3正在为每个请求生成会话文件,为什么?_Php_Codeigniter - Fatal编程技术网

Php CodeIgniter 3正在为每个请求生成会话文件,为什么?

Php CodeIgniter 3正在为每个请求生成会话文件,为什么?,php,codeigniter,Php,Codeigniter,我使用CodeIgniter(v3.1.11)作为我的webapp和文件的会话驱动程序 会话库是自动加载的,配置如下 $config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 21600; $config['sess_use_database']

我使用CodeIgniter(v3.1.11)作为我的webapp和文件的会话驱动程序

会话库是自动加载的,配置如下

$config['sess_driver']                  = 'files';
$config['sess_cookie_name']             = 'ci_session';
$config['sess_expiration']              = 21600;
$config['sess_use_database']            = false;
$config['sess_table_name']              = 'ci_sessions';
$config['sess_match_ip']                = false;
$config['sess_time_to_update']          = 300;
$config['sess_save_path']               = APPPATH . "cache/sessions/";
当我登录时,我使用
$this->session->set\u userdata($myData)
它创建了相应的会话文件,其中包含我需要的信息

user@:~/path/to/application/cache/sessions$ sudo cat ci_sessionb69ca97bce23674e94809941346fae7300c4afaa
username|s:9:"user";id|i:2;logged_in|b:1;language|s:2:"EN";
但是,当我的前端请求CodeIgniter控制器时,会为每个请求创建一个新的会话文件,其中包含空数据,我最终无法检索存储在初始会话文件中的数据

user@:~/path/to/application/cache/sessions$ sudo cat ci_sessiondcdd28185aa2f7c9a4f83841193e8c826399abc5
__ci_last_regenerate|i:1603286120;

什么可能会发生这种情况?

设置
$config['sess\u time\u to\u update']=0
$config['sess\u time\u to\u update']=$config['sess\u expiration']

此选项控制会话类重新生成自身和创建新会话ID的频率。将其设置为0将禁用会话ID重新生成


解决方案一:在前面,您可以尝试将会话库名称放入application/config/autoload.php中的autoloader配置中

$autoload['libraries'] = array('session');
$autoload['libraries'] = array('session')
解决方案二:可以使用数据库会话

$config['sess_driver']                  = 'database';
$config['sess_cookie_name']             = 'ci_session';
$config['sess_expiration']              = 21600;
$config['sess_use_database']            = false;
$config['sess_table_name']              = 'ci_sessions';
$config['sess_match_ip']                = false;
$config['sess_time_to_update']          = 300;
$config['sess_save_path']               = APPPATH . "cache/sessions/";
此外,还需要在数据库中创建该表

CREATE TABLE `sessions` (
  `id` varchar(40) NOT NULL,
  `ip_address` varchar(45) NOT NULL,
  `timestamp` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `data` blob NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
解决方案三:如果需要,可以使用下面的代码来停止会话记录

创建一个文件application/libraries/Session/MY_Session.php

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

class MY_Session extends CI_Session {

    public function __construct(array $params = array())
    {   
        if ( $this->ignore_sessions() )
            return;
        parent::__construct();
    }   

    function ignore_sessions()
    {   
        $uri = str_replace ("//", "/", $_SERVER['REQUEST_URI']);
        if ( strpos($uri, '/ignore_this_controller/') === 0 ) 
            return true;
        return false;
    }   
}

由于http是一种无状态协议,用户跟踪将使用以下方法完成:

服务器令牌发送到客户端,然后客户端在下次请求时返回该令牌

这种方法可以通过多种方法实现:

  • 以html格式发送带有标记的隐藏输入
  • 使用标记设置cookie
会话*机制使用cookie方法

最初,服务器在httpResponse的cookie中设置会话id。和 客户端返回每个httpRequest的会话id

因此,您的前端需要在其请求上设置cookie(会话id),并在每个请求中将其发送到服务器


为了防止服务器为每个http请求初始化新的会话id会话文件

不幸的是,我仍然在每个请求上生成了多个文件需要更多信息:php会话设置、codeigniter版本、您的身份验证代码以及如何测试它?在codeigniter 3-4中工作正常您运行的是哪个PHP版本的CI3安装?您使用的是SPA框架吗?如果是这样,您在前端使用的是哪种框架?