php会话保存数据技术 php聊天记录怎么保存( 四 )


其实,并不是 Session 数据被删除(也有可能是,概率比较小,参见上一节) 。只是关闭浏览器时,保存 session_id 的 Cookie 没有了 。也就是你弄丢了打开超市储物箱的钥匙(session_id) 。
同理,浏览器 Cookie 被手动清除或者其他软件清除也会造成这个结果 。
为什么浏览器开着,我很久没有操作就被登出了
这个是称为“防呆”,为了保护用户账户安全的 。
这个小节放进来,是因为这个功能的实现可能和 Session 的删除机制有关(之所以说是可能,是因为这个功能不一定要借住 Session 实现,用 Cookie 也同样可以实现) 。说简单一点,就是长时间没有操作,服务端的 Session 文件过期被删除了 。
一个有意思的事情
在我试验的过程中 , 发现了小有意思的事情:我把 GC 启动的概率设置为 100% 。如果只有一个访问者请求,该访问者即使过了很久(超过了过期时间)后才发起第二次请求 , 那么 Session 数据也还是存在的('session.save_path' 目录下面的 Session 文件存在) 。是的,明明就超过了过期时间,却没有被 GC 删除 。这时,我用另外一个浏览器访问时(相对于另一个访问者),这次请求生成了新的 Session 文件,而上一个浏览器请求生成的那个 Session 文件终于没有了(之前那个 Session 文件在 'session.save_path' 目录下面的消失了) 。
还有,发现 Session 文件被删除后,再次请求 , 还是会生成和之前文件名相同的 Session 文件(因为浏览器并没有关闭,再次请求发送的 session_id 是相同的 , 所以重新生成的 Session 文件的文件名还是一样的) 。但是 , 我不理解的是:这个重新出现的文件的创建时间竟然是第一次的那个创建时间,难道它是从回收站中回来的?(确实 , 我做这个试验时是在 window 下进行的)
我猜测的原因是这样:当启动会话后,PHP 根据 session_id 找到并打开了对应的 Session 文件 , 然后才启动 GC 进程 。GC 进程就只检查除了当前这个 Session 文件外的其他文件,发现过期的就干掉 。所有,即使当前这个 Session 文件已经过期了 , GC 也没有删除它 。
我认为这个不合理的 。
由于发生这种情况影响也不大(毕竟线上请求很多,当前请求的过期文件被其他请求唤起的 GC 干掉的可能性是比较大的) + 我没有信心去看 PHP 源代码 + 我并不在线上使用 PHP 自带的 files 型 Session 处理器 。所以,这个问题我就没有深入研究了 。请谅解 。
?php
// 过期时间设置为 30 秒
ini_set('session.gc_maxlifetime', '30');
// GC 启动概率设置为 100%
ini_set('session.gc_probability', '100');
ini_set('session.gc_divisor', '100');
session_start();
$_SESSION['name'] = 'Jing';
var_dump($_SESSION);
?
【php会话保存数据技术 php聊天记录怎么保存】关于php会话保存数据技术和php聊天记录怎么保存的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

推荐阅读