【问题标题】:Session is lost after some time around 25 minutes大约 25 分钟后会话丢失
【发布时间】:2018-02-22 05:41:29
【问题描述】:

我在 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
  • 是的,我也检查了 htaccess 文件,那里什么都没有。

标签: php apache session configuration


【解决方案1】:

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

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

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

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

所以您需要做的是在您使用会话的每个页面中分配ini_set(),或者,更好的选择是直接将php.ini文件修改为您需要的值.

请注意,25 分钟大约是 1440 秒(24 分钟),所以它肯定使用php.ini 的值。

【讨论】:

  • ini_set() 分配实际上用在每个页面上。如果它在每个页面上,这不应该保留这个新值吗?
  • @Shaonline 如果你有一个基于 debian 的系统,垃圾收集是通过每分钟左右触发的 cronjob 完成的。此脚本(和类似的实用程序脚本)将使用默认的 php.ini 值运行。 ishegg 是正确的,您应该在主 php.ini 文件中设置此设置,而不是用户空间中的脚本。
  • @OptimusCrime 所说的一个(位)“hacky”解决方法是将session.save_path 设置到另一个目录,这样cronjob 就无法使用session_save_path() 访问它。这当然不太理想。您是否可以直接在 ini 文件中更改值?
  • 看来这是唯一的出路,但我仍然没有弄清楚原因。我这样说是因为相同的代码在两个不同的环境中。我只在一个问题上遇到了这个会话问题,其中 session.gc_maxlifetime 的 php.ini 值在两个环境中都是 1440。
  • 嗯,这可能是您调试过程的起点。两者有什么不同?硬件、软件、设置等? (显然,与会话相关)。
猜你喜欢
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多