我有一个包含多个页面的表单。我使用$_SESSION
数组来存储用户输入。每个页面都以
session_start();
有时$_SESSION
个变量会丢失。我想如果用户长时间保持这种情况会发生这种情况,Garbage Collector会删除变量。
如果我理解正确,那么函数session_status()仅检查会话是否已经启动,而不是垃圾收集器最近是否删除了任何条目。
如果垃圾收集器变为活动状态,是否会删除$_SESSION
阵列的所有条目或仅删除其中一些?换句话说,我可以通过简单地执行以下操作来检查我的会话是否已过期:
session_start();
if(empty($_SESSION)){
// Garbage Collecter removed entries because user was too long afk
}
答案 0 :(得分:3)
整体机制并不像你想象的那么复杂。
会话可以有多个存储back-ends,其默认值是内置文件处理程序,它只创建文件:
将给定文件与给定会话链接的唯一方法是会话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);