sesssion

一直不是很明白session问题,今天做了两个测试

先找到php.ini 目录下的session.save_path的保存目录,

<?php

session_start();

echo session_id();

$_SESSION['name'] =1;

?>

运行次代码后会在目录下生成session文件

关闭浏览器,发现该session文件依然存在。

于是

<?php

session_id(’上一步的seesionid‘)

session_start();

echo $_SESSION['name'] 

?>

打开浏览器运行代码后, 可以获取上一次session的值, 由此可知,如session一直未被销毁, 可以根据session_id 来获取session信息。

 

 Session 与 GC
由于PHP的工作机制,它并没有一个daemon线程来定期的扫描Session信息并判断其是否失效,当 一个有效的请求发生时(不是异步的,会阻塞该用户请求,因此才需要概率来启动。)且在session初始化(session_start()),PHP 会根据全局变量 session.gc_probability和session.gc_divisor的值,来决定是否启用一个GC, 在默认情况下,session.gc_probability=1, session.gc_divisor =100也就是说有1%的可能性启动GC(也就是说100个请求中只有一个gc会伴随100个中的某个请求而启动).
GC的工作就是扫描所有的Session信息,用当前时间减去session最后修改的时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过gc_maxlifetime(默认24分钟),就将该session删除。
但是,如果你Web服务器有多个站点,多个站点时,GC处理session可能会出现意想不到的结果,原因就是:GC在工作时,并不会区分不同站点的session.

那么这个时候怎么解决呢?
1. 修改session.save_path,或使用session_save_path()让每个站点的session保存到一个专用目录,
2. 提供GC的启动率,自然,GC的启动率提高,系统的性能也会相应减低,不推荐。
3. 在代码中判断当前session的生存时间,利用session_destroy()删除

posted @ 2017-05-24 21:42  寻觅微笑  阅读(51)  评论(0)    收藏  举报