搜索

首页  >  问答  >  正文

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

<p>我正在使用 CodeIgniter 3 框架开发一个长期运行的项目。几个月来,我们一直遇到会话随机丢失的问题。我已将框架文件更新到最新版本(3.1.13)。看起来这解决了开发服务器上的问题,但在生产中它仍然存在。但我注意到现在只有当响应发送新的会话 cookie 时才会发生这种情况,这会在重新生成会话 id 时发生。当我更改 <code>$config['sess_time_to_update']</code> 时,它会正确反映所需的时间。</p> <p>开发服务器和生产服务器之间的区别在于会话驱动程序 - 它是开发服务器上的文件,而在生产环境中我们使用 memcached。所以我做了一个实验,将驱动程序切换到文件,会话不再丢失。我还尝试使用 Redis 驱动程序进行设置,也没有引起问题。所以肯定是Memcached驱动的问题。但我不想换另一个。日志中没有错误。我还检查了 php.ini 文件和 memcached 变量都是默认值。</p> <p>CodeIgniter v3.1.13、PHP 7.4.3、适用于 Memcached 的 Amazon ElastiCache</p> <p>这是配置:</p> <pre class="brush:php;toolbar:false;">$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;</pre> <p>任何在哪里查看或检查什么内容的想法将不胜感激。</p>
P粉356361722P粉356361722459 天前551

全部回复(2)我来回复

  • P粉797855790

    P粉7978557902023-09-01 15:45:09

    查看此答案。显然,如果您将会话的最大过期时间设置为大于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 数据库来代替会话存储,我认为生产环境上的性能不会有太大不同在这两种情况下。

    回复
    0
  • P粉762730205

    P粉7627302052023-09-01 11:17:20

    如果您使用的是 AWS ElastiCache Memcached 集群,请检查您在配置中使用的终端节点 $config['sess_save_path']。一种选择是使用配置端点(其中包含 .cfg.),另一种选项是单个节点端点(包含 .0001..0002. 等)。如果您使用配置终端节点,请确保启用了自动发现(需要在服务器上进行额外安装 - 适用于 PHP 的 ElastiCache 集群客户端)。如果不启用,您的节点将无法正确解析,从而导致此类问题。

    事实证明我就是这种情况。我尝试在会话 startregeneratedestroy 上记录消息,并且使用文件驱动程序会发生重新生成,而使用 memcached 时它甚至不会调用除 session_start() 之外的任何函数。经过一番调查后,我决定重新检查主机并偶然发现 这个AWS 中的指南。事实证明,在问题开始时,第二个节点已添加到我们的 Memcached 集群中,但我们一直在使用配置端点,而没有设置此 自动发现。我根本不确定设置是如何工作的。因此,我将 $config['sess_save_path'] 更改为其中一个节点的端点,问题就消失了。在我安装和设置所需的模块之前,并且在节点未更改的情况下,此解决方案应该有效。

    回复
    0
  • 取消回复