PHP SESSION 回收机制

来源:互联网 发布:猛将源代码修改数据 编辑:程序博客网 时间:2024/06/05 09:41

Session回收  

通过上文几节介绍,我们知道session数据存放在服务端指定的session.save_path目录中,同时会在用户端存放一条Cookie用以记录分配给用户的session id。所以,session数据失效分服务端和客户端,要删除(回收)的对象也很清楚: 1,服务端:删除过期的session文件,启动PHP GC回收。 2,用户端:使存储了过期session_id的用户端Cookie记录过期。通过将Cookie的Expire设置为负值,要求客户端删除Cookie。 服务端:删除过期的session文件       PHP GC进程被启动以后,则会扫描session.save_path,找出过期的session,并删除该session文件。所谓,过期的 session,是指操作系统当前时间与session文件最后访问时间之差大于session.gc_maxlifetime的话,该session认 为是过期了。注意:有时候,你会发现,即便是文件过期了,有可能也没有被及时地删除掉。这是因为,每次session初始化的时候,并不会都启动PHP GC进程的,启动GC进程会大大降低php的运行效率。所有一个启动概率,这个概率由php.ini设定session.gc_probability / session.gc_divisor二个设置决定,默认概率是1%(1/1000)。这意味着,每1000次用户请求中,会启动1次PHP GC回收session文件


与session回收相关的php.ini设置:

1, session.gc_probability和session.gc_divisor 由 这二个函数决定了启用GC的概率,默认是1/1000。也就是说,每一千次用户请求中有一次会启动GC回收session。启动GC进程不宜过于频繁。上 面的例子,我们可以看到,它会每次检查session.save_path目录下每个文件的状态。这样会降低php的执行效率。

2, session.gc_maxlifetime = 1440 设置session存活时间,单位是秒。每次GC启动后, 会通过stat得到session文件最后访问的unix时间,通过现在时间减去文件最后访问时间之间大于session.gc_maxlifetime,则会删除该文件。

总结  

1, PHP使用Cookie的方法传递session id。尽量不要使用GET方法传递session id,因为这样很不安全。

2, 可以通过setcookie()的方法,将客户端的session id的Cookie记录删除。

3, PHP GC进程由session初始化启动。但不是每一次用户请求都会被启动,它的启动概率默认是1/1000。过于频繁访问的网站,并发量大的网站,可减小PHP GC的启动频率。PHP GC回收session会降低php的执行效率。

4, 通过下面代码,优化session回收

 <?php
session_start();
if (isset($_SESSION['SESS_TIMEOUT'])) {
  if ($_SERVER['REQUEST_TIME'] > $_SESSION['SESS_TIMEOUT']) {
    setcookie(session_name(), session_id(), -1, '/');
    session_unset();
    session_destroy();
  }
} else {
  $_SESSION['SESS_TIMEOUT'] = $_SERVER['REQUEST_TIME'] + 3600;
}