PHP没有增加会话超时


PHP not incresing session timeout

几天来,我一直在努力增加网站管理区域的会话超时。工作人员必须登录,当他们被电话打断时,经常会丢失所有数据。

我无法将php.ini文件设置得更高,因为该网站有数千个用户,会话文件夹将变为massiv。

我使用.htaccess将会话时间设置为一天。使用phpinfo()进行检查,显示本地值为86400。使用ini_get还返回86400

但是sessions文件夹中没有比标准php.ini 早25分钟1440秒的文件

我还能做些什么来增加管理文件夹的会话超时?

目前尚不清楚您将哪些php配置修改为86400,但php会话与多个配置指令绑定,这些指令可能会影响会话的使用寿命。

由于会话由两部分组成(位于客户端的cookie和位于服务器端的会话文件),因此有两个主要值控制它们的每个生存时间。

会话Cookie[客户端]

cookie由session.cookie_lifetime指令控制,默认情况下,该指令设置为0,这意味着一旦用户关闭浏览器,它就会过期。该值通常应大于或至少等于session_gc.maxlifetime值。

会话文件[Server]

服务器上的会话文件由session.gc_maxlifetime指令控制,默认情况下,该指令设置为1440(即24分钟)。这是服务器端会话在被PHP标记为垃圾收集之前可以保持非活动状态的时间。

还有许多其他变量会影响服务器端会话的垃圾收集,但主要是会话生存时间和cookie生存时间必须相等,会话才能有效地持续至少那么长时间。两个指令都以秒为单位。

边缘案例

最后,您使用的是修补版本的PHP(就像Ubuntu等基于Debian的发行版通常提供的版本一样),这些版本在PHP包中放置了自己的垃圾收集例程。这可以由一个系统crontab控制,该系统执行自己的垃圾收集例程,并可能有效地意外地更改PHP的股票行为。

来自手册

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

这意味着,如果有多个会话位于同一目录中,具有不同的生存期值,那么最短的生存期可能会触发垃圾收集器清理这些会话。这是因为gc不需要根据会话的不同配置来区分会话,而是根据哪个会话在特定的存储路径上触发gc(则会清除所有超过TTL的文件,而不管如何)。

因此,只需将那些您希望具有不同生存期的会话放在不同的目录中,方法是给它们一个与您通常希望持续较短时间的默认会话不同的session.save_path