为什么gc_maxlifetime胜过sess_expiration?

时间:2016-03-29 19:54:13

标签: php codeigniter

gc_maxlifetime已设置为24分钟,但每个应用程序具有不同的sess_expiration。其中一个设置为9000秒(2 1/2小时)。该应用已根据gc_maxlifetime而非sess_expiration过期。这是为什么?如果sess_expiration长于gc_maxlifetime,它怎么能工作?

2 个答案:

答案 0 :(得分:0)

从这里开始阅读:why ini_set('session.gc_maxlifetime',60) doesn't work?和此处:https://www.dev-metal.com/how-the-php-session-garbage-collector-really-works/

  

因为垃圾收集器在会话

之前启动(如果启动)

我认为gc_maxlifetime会在您的CI会话处理程序之前触发,为此它会赢得'。

如果没有被强制修改您的php.ini文件,您可以尝试在每个session_start之前设置它:

ini_set("session.cookie_lifetime","7200");
ini_set("session.gc_maxlifetime","7200");
session_start();

或者在.htaccess文件中:

php_value session.gc_maxlifetime 7200
php_value session.cookie_lifetime 7200

您可以在此处阅读更多内容:Codeigniter increase session time out not working

希望它有所帮助!

答案 1 :(得分:0)

并不像你说的那么简单......

是真的gc_maxlifetime决定是否应该删除会话,因为这实际上是“服务器端计时器”,它会计入删除会话的次数 - 客户端也有一个,因为这是存储cookie的地方 但是,CodeIgniter会将gc_maxlifetime设置为您放在sess_expiration中的相同值,除非它是0 (在这种情况下它使用您的php.ini值)。

但你问题中的其他内容可能很重要:

  

但是每个应用程序都有不同的sess_expiration。其中一个设置为9000秒(2 1/2小时)

如果您在同一台服务器上使用相同的sess_save_pathsess_cookie_namesess_match_ip,但对于多个应用程序...则sess_expiration值最低的应用程序在某些时候会删除您打算对其他人有效的会话。

TL; DR:不要将相同的会话“空间”用于单独的应用程序。