增加 php 会话时间

2022-08-30 23:49:11

我正在尝试将我的php会话时间增加到6小时。

下面是增加会话时间的代码:

ini_set('session.gc_maxlifetime', 60 * 60 * 6); // 6 Hours 

但是,它似乎只有1小时的会话时间。

任何建议都非常感谢。

另外,我如何测试此功能,而不必等待6个小时来查看我的会话是否超时。


答案 1

场景

您正在运行 Debian Linux 或 Ubuntu Linux。您希望 PHP 会话的持续时间长于默认的 1440 秒(24 分钟)。所以你这样做:

ini_set('session.gc_maxlifetime', 10800);    # 3 hours

使用此设置时,只要用户不关闭浏览器,会话应保持活动状态至少三个小时。

但无论你做什么,会话都会在24-54分钟后被删除。PHP似乎忽略了gc_maxlifetime设置。

为什么会发生这种情况

Debian 和 Ubuntu Linux 会覆盖 PHP 的会话行为。如果你仔细观察,你会发现session.gc_probability设置为0,这意味着PHP的垃圾回收永远不会运行。相反,在 /etc/cron.d/php5 中有一个特定于 Debian 的 cron 作业,每 30 分钟运行一次!

cron 作业基于 php 中的全局session.gc_maxlifetime进行垃圾回收.ini。应用中的session.gc_maxlifetime将被忽略。

解决方案

虽然您可以禁用cron作业和/或修改php.ini,但我宁愿在不修改系统默认值的情况下解决问题。更好的解决方案是创建自己的会话目录,在正常目录之外的某个地方,然后在本地启用PHP的会话垃圾回收。

为此,请执行以下操作:set session.gc_maxlifetime, session.gc_probability, session.gc_divisor, and session.save_path

# Session lifetime of 3 hours
ini_set('session.gc_maxlifetime', 10800);

# Enable session garbage collection with a 1% chance of
# running on each session_start()
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);

# Our own session save path; it must be outside the
# default system save path so Debian's cron job doesn't
# try to clean it up. The web server daemon must have
# read/write permissions to this directory.
session_save_path(APP_PARENT_DIR . '/sessions');

# Start the session
session_start();

答案 2

如果运行另一个脚本(例如,另一个vhost)使用相同的session.save_path,则通过ini_set增加session.gc_maxlifetime可能不起作用。另一个脚本按其自身的生存期删除所有脚本的会话:

注意:
如果不同的脚本具有不同的session.gc_maxlifetime值,但共享相同的位置来存储会话数据,则具有最小值的脚本将清理数据。在这种情况下,请将此指令与session.save_path一起使用。

资料来源:http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime

另外,请务必在session_start()之前更改设置。如果您启用了session.auto_start,则在使用ini_set时会延迟。


推荐