会话在大约25分钟后丢失。

3

我正在使用 Apache 服务器 2.4.16 上的 PHP 5.5.38。在大约 25 分钟后,我会遇到会话丢失的问题。我在 php.ini 文件中找到了以下参数:

session.gc_maxlifetime = 1440
session.gc_probability = 10

但是在代码中,这些值被设置为不同的值。代码如下:

ini_set('session.gc_maxlifetime', 60*60*24*7);
ini_set('session.use_cookies', 1);
ini_set('session.gc_probability', 0);

我确认它们返回了旧值,这意味着它没有失败或其他问题。

我不知道在哪里寻找失去会话的原因。有任何想法或建议将不胜感激。


你检查了你的htaccess文件吗?你有像php_value session.gc_maxlifetime这样的东西吗? - Thamaraiselvam
是的,我也检查了htaccess文件,里面没有任何内容。 - Shaonline
1个回答

1
当您使用ini_set()设置配置值时,它仅在当前脚本执行期间有效:

配置选项将在脚本执行期间保持此新值,并在脚本结束时恢复。

而且,当session.gc_maxlifetime有多个值时,垃圾收集器将使用最低值:

如果不同的脚本具有不同的session.gc_maxlifetime值,但共享存储会话数据的相同位置,则具有最小值的脚本将清理数据。

因此,您需要做的是,在每个使用会话的页面中都有ini_set()分配,或者更好的选择是直接修改php.ini文件为您所需的值。
请注意,25分钟约为1440秒(24分钟),因此它绝对使用了php.ini的值。

ini_set()的赋值实际上在每个页面上都被使用。如果它在每个页面上都存在,那么这个新值不应该被保留下来吗? - Shaonline
1
如果您使用的是基于Debian系统,那么垃圾收集会通过每一分钟左右触发的cronjob来完成。这个脚本(以及类似的公用程序脚本)将使用默认的php.ini值执行。ishegg是正确的,您应该在主php.ini文件中设置此设置,而不是在用户地区的脚本中设置。 - OptimusCrime
一个有点"hacky"的解决方法是设置session.save_path到另一个目录,这样cronjob就无法访问它了,使用session_save_path()。当然,这不是理想的解决方法。您是否可以直接在ini文件中直接更改这些值呢? - ishegg
看起来这是唯一的方法,但我仍然没有弄清原因。我之所以这么说,是因为相同的代码在两个不同的环境中。我只在其中一个环境中遇到了这个会话问题,在这两个环境中,php.ini值的session.gc_maxlifetime都是1440。 - Shaonline
那可能是你调试过程的起点。两者之间有什么不同?硬件、软件、设置等等?(显然,与会话相关)。 - ishegg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接