检查垃圾收集器是否删除了Session

时间:2017-03-27 09:28:15

标签: php

我有一个包含多个页面的表单。我使用$_SESSION数组来存储用户输入。每个页面都以

开头
session_start();

有时$_SESSION个变量会丢失。我想如果用户长时间保持这种情况会发生这种情况,Garbage Collector会删除变量。

如果我理解正确,那么函数session_status()仅检查会话是否已经启动,而不是垃圾收集器最近是否删除了任何条目。

如果垃圾收集器变为活动状态,是否会删除$_SESSION阵列的所有条目或仅删除其中一些?换句话说,我可以通过简单地执行以下操作来检查我的会话是否已过期:

session_start();
if(empty($_SESSION)){
   // Garbage Collecter removed entries because user was too long afk
}

1 个答案:

答案 0 :(得分:3)

整体机制并不像你想象的那么复杂。

会话可以有多个存储back-ends,其默认值是内置文件处理程序,它只创建文件:

Files in Windows Explorer

将给定文件与给定会话链接的唯一方法是会话ID,如您所见,它是文件名的一部分。

垃圾收集是基于上次修改时间的文件删除。一旦发生,文件就永远消失了。该文件不存在任何痕迹或记录。

一般情况下,您不必担心此案例。只需确保为您的应用定义足够长的生命周期。许多系统中的默认值通常为20到30分钟,这相当小。另外,请确保您的应用有自己的会话目录,因此其他使用寿命较短的应用无法删除您的文件:

session_save_path('/home/foo/app/sessions');
ini_set('session.gc_maxlifetime', 86400); // 1 day (in seconds)

P.S。某些Linux系统禁用PHP垃圾回收并将其替换为自定义cron脚本,这会阻止自定义位置被清除。出于这个原因,我通常设置这些其他指令以防万一:

// Restore the default values
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);