我花了一些时间寻找一个关于php.ini服务器设置如何使会话过期的好答案。我找到了很多信息,但花了一段时间才弄清楚为什么这些设置能够起作用。如果你和我一样,这可能对你有所帮助:
会话被存储为cookie(客户端电脑上的文件)或者作为服务器端文件存储在服务器上。这两种方法都有优缺点。
对于存储在服务器上的会话,使用了三个变量。
session.gc_probability
session.gc_divisor
session.gc_maxlifetime
(session.gc_probability/session.gc_divisor) 产生垃圾回收程序运行的概率。当垃圾回收器运行时,它会检查那些至少有 session.gc_maxlifetime 时间没有被访问的会话文件并将其删除。
这在论坛帖子中已经解释得很清楚了(尤其是这个!)- 但是以下问题确实会出现:
1.) 这种概率是如何应用的?服务器什么时候掷骰子?
A: 每次在服务器上调用任何活动会话期间的 session_start() 时,服务器都会掷骰子。这意味着,如果您使用 session.gc_probability = 1 和 session.gc_divisor = 100 的默认值,则每调用 100 次 session_start(),您应该看到垃圾收集器大约运行一次。
2.) 在低流量服务器上会发生什么?
A: 当调用 session_start() 时,它首先刷新会话并使会话值对您可用。这会更新服务器上会话文件的时间。然后它掷骰子,如果赢了(100 次中的 1 次),则调用垃圾收集器。然后,垃圾收集器检查所有会话 ID 文件,并查看是否有任何符合删除条件的文件。
这意味着如果服务器上只有您一个人,您的会话将永远不会失效,
似乎更改设置没有任何影响。假设您将session.gc_maxlifetime更改为10,
将session.gc_probability更改为100。这意味着垃圾回收器运行的概率为100%,
它将清除任何最后一次访问时间超过10秒的会话文件。
如果您是服务器上唯一的用户,则您的会话将不会被删除。
您需要至少有1个其他活动会话才能使您的会话失效。
因此,在低容量服务器或低容量时间上,可能要比session.gc_maxlifetime长得多,
垃圾回收器实际上才会运行并且会话实际上才会被删除。
而不知道如何工作,这可能对您来说完全是随机的。
3.) 为什么他们使用概率?
A:性能。在高流量服务器上,您不希望垃圾回收器在每个session_start()请求中运行。
这会不必要地使服务器变慢。因此,根据服务器流量的不同,您可能需要增加
或减少垃圾回收器运行的概率。
希望这能为你解决问题。如果你和我一样,尝试了session.gc_maxlifetime却似乎没有起作用(因为你在开发服务器上尝试,以免打扰其他人),那么希望这篇文章能帮你省去一些困惑。
祝你好运!