网上很多人给出了解答修改php配置文件中的sessiongc_maxlifetime如果想了解更多session回收机制继续阅读(本文环境php)
概述每 一次php请求会有/的概率(默认值)触发“session回收”如果“session回收”发生那就会检查/tmp/sess_*的文 件如果最后的修改时间到现在超过了秒(gc_maxlifetime的值)就将其删除意味着这些session过期失效
session在server端(一般是Apache with PHP module)如何存在的?
默认的php会将session保存在/tmp目录下文件名为这个样子sess_aabfddcebafb每一个文件对应了一个session(会话)
more /tmp/sess_aabfddcebafb
username|s::”jiangfeng”;admin|s::”″;
#变量名|类型:长度:值
删除这里的session文件就表示对应的session失效了
session在client端(一般是浏览器)如何存在的?
session 在浏览器端只需要保存session ID(由server端生成的唯一ID)就可以了有两种保存方式在cookie中在url里面如果cookie中保存session ID就可以看到浏览器的cookie中有一个PHPSESID变量如果是URL传递的就可以看到形如:
indexphp?PHPSESID=aabfddcebafb的URL(在server端通过sessionuse_cookies来控制使用哪一种方式)
在server端php如何判断session文件是否过期?
如果”最后的修改时间”到”现在”超过了gc_maxlifetime(默认是)秒这个session文件就被认为是过期了在下一次session回收的时候如果这个文件仍然没有被更改过这个session文件就会被删除(session就过期了)
简单的说如果我登录到某网站如果在秒(默认值)内没有操作过那么对应的session就认为是过期了
所以修改phpini文件中的gc_maxlifetime变量就可以延长session的过期时间了(例如我们把过期时间修改为秒)
sessiongc_maxlifetime =
然后重启你的web服务(一般是apache)就可以了
注意php里面session过期使用了回收机制这里设置时间为秒如果session在秒内没有被修改过那么在下一次“回收”时才真的被删除
session“回收”何时发生?
默认情况下每一次php请求就会有/的概率发生回收所以可能简单的理解为“每次php请求就有一次回收发生”这个概率是通过以下参数控制的
#概率是gc_probability/gc_divisor
sessiongc_probability =
sessiongc_divisor =
注意假设这种情况gc_maxlifetime=如果某个session文件最后修改时间是秒之前那么在下一次回收(/的概率)发生前这个session仍然是有效的
注意如 果你的session使用sessionsave_path中使用别的地方保存sessionsession回收机制有可能不会自动处理过期 session文件这时需要定时手动(或者crontab)的删除过期的sessioncd /path/to/sessions; find cmin + | xargs rm
一些特殊情况
因为回 收机制会检查文件的“最后修改时间”所以如果某个会话是活跃的但是session的内容没有改变过那么对应的session文件也就没有改变过回 收机制会认为这是一个长时间没有活跃的session而将其删除这是我们不愿看到的可以通过增加如下的简单代码解决这个问题
<?php if(!isset($_SESSION[last_access])||(time()$_SESSION[last_access])>) $_SESSION[last_access] = time(); ?>
代码会每隔秒尝试修改修改一次session
总结如果想修改session过期时间修改变量gc_maxlifetime就可以了php的session采用被动的回收机制(garbage collection)过期的session文件不会自己消失而是通过触发“回收”来处理过期的session