PHP如何设置一个30分钟过期的Session?

275 3月之前 PHP Session

答案

  1. 设置seesion.cookie_lifetime时间30分钟, 并设置session.gc_maxlifetime也为30分钟.
  2. 自己为每一个Session值增加Time stamp.
  3. 每次访问之前, 判断时间戳.

答案解析

PHP端的session涉及到php.ini中的几个配置:

  • session.save_path:Session文件保存的位置,Linux下默认在/tmp目录下。
  • session.gc_maxlifetime:Session值在经过这个时间后会被标记为垃圾,默认是1440秒,也就是24分钟。
  • session.gc_probability:Session垃圾回收概率分子,默认是1
  • session.gc_divisor:Session垃圾回收概率分母,默认是100
  • session.cookie_lifetime:用以保存Session名称的Cookie的过期时间,默认是0,也就是直到浏览器重启。

连贯起来说就是,在默认配置下,

  1. 每个session值在赋值后,会在24分钟后被标记为垃圾,不过也只是被标记,session文件并不会从/tmp目录下删除。
  2. 如果在24分钟之前session又有值写入,那么标记为垃圾的时间再往后移动。
  3. 如果此时客户端浏览器关闭,客户端的Cookie["PHPSESSID"]被销毁,但是服务器下的session值并不会因此被标为垃圾,session文件也依然还在,不会被删除。
  4. 当PHP服务器收到一个请求,执行一次1÷100,也就是 1% 的概率计算,如果计算结果是true执行session垃圾回收,从/tmp下删除所有标为垃圾的session文件;如果计算结果是false,不执行垃圾回收,等待下一次请求。

由此可见,如果PHP接收的请求很频繁,或者配置概率增大,那么这个session过期时间用session.gc_maxlifetime就比较准确,但是服务器的压力就会相应增加。

参考资料