每次调用session_start时,都会更新会话文件的时间戳(如果存在),该时间戳用于计算是否超过了session.gc_maxlifetime。
更重要的是,在超过session.gc_maxlifetime时间之后,您不能依赖会话过期。
PHP在当前会话加载后,在过期的会话上运行垃圾回收,并通过使用session.gc_probability和session.gc_divisor来计算垃圾回收将运行的可能性。默认情况下,其概率为1%。
如果访问者数量少,则闲置的用户可能会访问应该已过期并已删除的会话。如果这对您很重要,则需要在会话中存储时间戳并计算用户不活动的日志方式。
此示例替换session_start并强制超时:
function my_session_start($timeout = 1440) { ini_set('session.gc_maxlifetime', $timeout); session_start(); if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) { session_destroy(); session_start(); session_regenerate_id(); $_SESSION = array(); } $_SESSION['timeout_idle'] = time() + $timeout;}


