CodeIgniter 3会话在仅使用Memcached驱动程序重新生成会话ID时丢失

3htmauhk  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(118)

我正在用CodeIgniter 3框架做一个长时间运行的项目。几个月来我们一直遇到会话随机丢失的问题。我已经将框架文件更新到最新版本(3.1.13).看起来它修复了开发服务器上的问题,但是在生产中它仍然存在.但是我注意到它现在只在响应发送一个新的会话cookie时发生,这发生在会话id重新生成时。当我改变$config['sess_time_to_update']时,它正确地反映了它所花费的时间。
dev和prod服务器的区别在于会话驱动程序-它是dev上的文件,在生产中我们使用memcached.所以我做了一个实验,把驱动程序切换到文件,会话不再丢失.我也尝试了Redis驱动程序的设置,它也没有引起问题.所以一定是Memcached驱动程序的问题.但我不想切换到另一个.日志中没有错误,我也检查了php.ini文件和memcached变量都是默认值。
代码触发器v3.1.13,PHP 7.4.3
以下是配置:

$config['sess_driver'] = 'memcached';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 14400;
$config['sess_save_path'] = 'host.com:11211';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

任何想法在哪里寻找或检查什么将不胜感激。

h5qlskok

h5qlskok1#

查看this answer。显然,如果您将会话的最大过期时间设置为大于memcached的过期限制,则可能会出现此问题。在该帖子中,OP通过修复以下配置变量解决了此问题,您可以尝试:

define('SESSION_TIME_OUT', x);
ini_set('session.gc_maxlifetime', SESSION_TIME_OUT);
ini_set('session.cache_expire', SESSION_TIME_OUT);
session_start();

另一种替代方法是删除memcached并使用内存驻留的sqlite3数据库来存储会话,我认为这两种情况下生产环境的性能不会有太大差别。

相关问题