session不按时过期的解释
[| 2010/02/24 15:29]
今天发现一个问题:服务器上设置的session有效期是1440秒,但是我上午开的网页下午刷新session仍有效,查了一下,得到了结果:原来php的session过期垃圾收集机制是按概率启动的。
由于php的工作机制,它并没有一个守护线程来定时扫描session的过期与否,所以php采用了一种独特的方法:在每次访问请求时有一定概率启动垃圾收集过程。通过查看phpinfo()可以看到下面参数:session.gc_probability=1,session.gc_divisor=1000。也就是说每次访问有千分之一的概率启动垃圾收集过程。所以假如网站访问量很小的话可能很长时间都不会触发垃圾收集,自然session就不会过期了。
还有一个小问题,就是对于虚拟主机来说,同一台服务器上不同的虚拟主机默认放置session的位置是相同的,而gc(Garbage Collector)并不区分不同网站间的session,所以当各网站间设置的session有效期不同时可能并不能完全生效。解决方法就是修改session.save_path参数,将自己主机的session信息放到自定义的一个位置,这样就不会被“误伤”了。
参考资料:http://blog.sina.com.cn/s/blog_4d73c2c20100hahv.html
由于php的工作机制,它并没有一个守护线程来定时扫描session的过期与否,所以php采用了一种独特的方法:在每次访问请求时有一定概率启动垃圾收集过程。通过查看phpinfo()可以看到下面参数:session.gc_probability=1,session.gc_divisor=1000。也就是说每次访问有千分之一的概率启动垃圾收集过程。所以假如网站访问量很小的话可能很长时间都不会触发垃圾收集,自然session就不会过期了。
还有一个小问题,就是对于虚拟主机来说,同一台服务器上不同的虚拟主机默认放置session的位置是相同的,而gc(Garbage Collector)并不区分不同网站间的session,所以当各网站间设置的session有效期不同时可能并不能完全生效。解决方法就是修改session.save_path参数,将自己主机的session信息放到自定义的一个位置,这样就不会被“误伤”了。
参考资料:http://blog.sina.com.cn/s/blog_4d73c2c20100hahv.html