php gc机制,php Session gc机制下在window下与ununtu是不同的。

看到之前Mr_jing的session文章,受益匪浅。碰巧我也遇到了在win下session的问题。他在文章最后一个有意思的事提到了,当时我看到之后的感觉就是,太TMD(甜蜜的)缘分了。再然后我自己整了一篇比较水的日记我所理解的session_set_save_handler的执行顺序机制,可还是不甘心,究竟看看linux下session到底行不行,(现在win下肯定是不行的)。

在win下测试session gc机制

先说明环境-win下phpstudy

bVmTDI

2.php.ini配置

bVmTDN

3、代码开始write.php写入session,值为当前时间戳

session_start();

$_SESSION['nametime']=date('Y-m-d H:i:s',time());

echo '已经写入'.$sessionSavePath = ini_get('session.save_path');

var_dump($_SESSION);

4、读取session代码

echo 'maxlifetime'. ini_get('session.gc_maxlifetime')."
";

echo 'gc_probability'.ini_get('session.gc_probability')."
";

echo 'gc_divisor'.ini_get('session.gc_divisor')."
";

session_start();

echo '


'.'Session::=>';var_dump($_SESSION);

echo '


'.'Cookie::=>';

var_dump($_COOKIE);

echo '


';

echo "
ReadTime".date('Y-m-d H:i:s',time());

5、执行read.php

bVmTEc看到写入时间为17:57:04

6、读取session,可以看到读取session的值的(上面红椭圆圈)时间和写入时间都一样,都是

17:57:04,注意下面的readtime那一行是13:58:56,

bVmTEh

好的,截至到现在,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 也没有删除它。具体怎么实现,可以看源码

那么问题来了!!

当我们不停的在win平台刷新read.php这个页面,session的值一直能拿到。这就奇怪了,应该被回收了啊。怎么还能不停的拿到。理解中session gc是根据文件的最后修改时间与当前时间和ini中设置的maxlifetime时间做对比,然后触发回收机制。

我们来张图

bVmTE3

这就是奇葩所在

1、如果把这个session删除掉,然后在直接write,发现创建时间和刚刚删除之前的创建时间一样。名字相同咱可以理解,但是这个时间相同是肿么回事!windows偷懒把回收站给拿回来了?我把他清空了也是这样。

附上个gif图(我是有多无聊~,请用ie浏览器打开此图,或者美图秀秀,acdsee之类)

bVmT1D

在linux下session的gc

我本地搭建的virtualbox (ubuntu下的lamp)

配置如下图:

bVmT1Z

然后在来个动态图:显示写入session,然后查看session文件的状态,再然后读取,第一次读取,是有值的,而且两次查看stat sess**文件还在,我在刷新一次之后,那么值没有了。也就验证了session的流程是open read (gc) write close。请注意我第一次有值是之前打开的,并不是读取的write的值

bVmT2o

写在最后:

文章写的有点毛糙,乱起八遭。

最后感谢各位前辈的指点,尤其是cfc4nx。

下次再写清楚 点。。

参考更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值