Php CodeIgniter 3正在为每个请求生成会话文件,为什么?
我使用CodeIgniter(v3.1.11)作为我的webapp和文件的会话驱动程序 会话库是自动加载的,配置如下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']
$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框架吗?如果是这样,您在前端使用的是哪种框架?