看到以前Mr_jing的session文章,受益不浅。碰巧我也遇到了在win下session的问题。他在文章最后一个有意思的事提到了,当时我看到以后的感受就是,太TMD(甜蜜的)缘分了。再而后我本身整了一篇比较水的日记我所理解的session_set_save_handler的执行顺序机制,可仍是不甘心,究竟看看linux下session到底行不行,(如今win下确定是不行的)。php
2.php.ini配置linux
三、代码开始write.php写入session,值为当前时间戳laravel
<?php session_start(); $_SESSION['nametime']=date('Y-m-d H:i:s',time()); echo '已经写入'.$sessionSavePath = ini_get('session.save_path'); var_dump($_SESSION);
四、读取session代码ubuntu
<?php echo 'maxlifetime'. ini_get('session.gc_maxlifetime')."<br>"; echo 'gc_probability'.ini_get('session.gc_probability')."<br>"; echo 'gc_divisor'.ini_get('session.gc_divisor')."<br>"; session_start(); echo '<hr>'.'Session::=>';var_dump($_SESSION); echo '<hr>'.'Cookie::=>'; var_dump($_COOKIE); echo '<hr>'; echo "<br>ReadTime".date('Y-m-d H:i:s',time());
五、执行read.php看到写入时间为17:57:04segmentfault
六、读取session,能够看到读取session的值的(上面红椭圆圈)时间和写入时间都同样,都是
17:57:04,注意下面的readtime那一行是13:58:56,windows
好的,截至到如今,win上都没有问题。由于即便你的session的最大生存时间(session.gc_maxlifetime
)为5秒,你的gc比例为1:1,就是百分百回收。
可是注意:
gc回收是从你的session_start开始,而后执行的是open,read,而后是gc。
具体能够点这里看关于session的执行顺序。浏览器
因此即便某个session已通过期,你去读他,仍是有值的,下一次就被gc掉了。
(【有些朋友可能会想,那第一次读取有值,那判断用户登陆与否就不许确了啊,可是真实生产环境,确定不是单用户,触发session_start机制的情境不少,因此就不足为奇了。】以上说法是胡扯的!!!启动会话后,PHP 根据 session_id 找到并打开了对应的 Session 文件,而后才启动 GC 进程。GC 进程就只检查除了当前这个 Session 文件外的其余文件,发现过时的就干掉。全部,即便当前这个 Session 文件已通过期了,GC 也没有删除它。具体怎么实现,能够看源码<( ̄▽ ̄)/)session
那么问题来了!!
当咱们不停的在win平台刷新read.php这个页面,session的值一直能拿到。这就奇怪了,应该被回收了啊。怎么还能不停的拿到。理解中session gc是根据文件的最后修改时间与当前时间和ini中设置的maxlifetime时间作对比,而后触发回收机制。
咱们来张图测试
这就是奇葩所在
一、若是把这个session删除掉,而后在直接write,发现建立时间和刚刚删除以前的建立时间同样。名字相同咱能够理解,可是这个时间相同是肿么回事!windows偷懒把回收站给拿回来了?我把他清空了也是这样。
附上个gif图(我是有多无聊~,请用ie浏览器打开此图,或者美图秀秀,acdsee之类)spa
我本地搭建的virtualbox (ubuntu下的lamp)
配置以下图:
而后在来个动态图:显示写入session,而后查看session文件的状态,再而后读取,第一次读取,是有值的,并且两次查看stat sess**文件还在,我在刷新一次以后,那么值没有了。也就验证了session的流程是open read (gc) write close
。请注意我第一次有值是以前打开的,并非读取的write的值
写在最后:
文章写的有点毛糙,乱起八遭。
最后感谢各位前辈的指点,尤为是cfc4nx。
下次再写清楚 点。。