分享

session垃圾回收机制

 行者花雕 2022-10-31 发布于北京

1,php中seesion生成机制

我们先来分析一下php中是怎么生成一个session的。设计出session的目的是保持每一个用户的各种状态来弥补http协议的不足(无状态)。我们现在有一个疑问,我们都知道session保存在服务器。既然它用于保持每一个用户的状态那它利用什么来区别用户的呢?这个时候就需要借助cookie了。当我们在代码中调用session_start()时,php会同时往SESSION的存放目录(默认时/tmp/)和客户端的cookie目录各生成一个文件。session文件名称是这样的:

格式为sess_{SESSIONID},这时session文件中没有任何内容,当我们在session_start();添加了这两行代码:
代码如下:

$_SESSION['name'] = 'wanchun0222';
$_SESSION['blog'] = 'coderbolg.net';

这时文件就有内容了:
代码如下:

name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";

这时候再看cookie:

可以看到服务器为我们自动生成了一个cookie,cookie名称为"PHPSESSID",cookie内容是一窜字符,其实这窜字符就是{sessionid}。也许你就已经明白了,当我们使用session时,php就先生成一个唯一的sessionid号(如2bd170b3f86523f1b1b60b55ffde0f66),再在我们服务器的默认目录下生成一个文件,文件名为sess_{SESSIONID},同时在当前用户的客户端生成一个cookie,内容已经说过了。这样PHP会为每一个用户生成一个SESSIONID,也就是说一个用户一个session文件。PHP第一次为某个用户使用session时就向客户端写入了cookie,当这个用户以后访问时,浏览器会带上这个cookie,PHP在拿到cookie后就读出里面的SESSIONID,拿着这个SESSIONID去session目录下找session文件。找到后在调用$_SESSION['blog']的时候显示出来。

2.php中的session的过期回收机制

我们明白了session的生成及其工作原理,发现session目录下会有很多session文件。当然这些文件一定不是永远存在的,php一定提供了一种过期回收机制。在php.ini中session.gc_maxlifetime为session设置了生存时间(默认是1440s)。如果session文件的最后更新时间到当前时间超过了生存时间,这个session文件就被认为是过期了。在下一次session回收的时候就会被删除。那下一次session回收是什么时候呢?这就和php的请求次数有关。在php内部机制中,当php被请求了N次后就会有一次触发回收机制。到底是请求多少次触发一次是通过一下两个参数控制的:

代码如下:

session.gc_probability = 1
session.gc_divisor = 100

这是php.ini的默认设置,意思是每100次php请求就有一次回收发生。概率是gc_probility/gc_divisor。我们了解了服务器端的session过期机制,再来看看客户端的cookie过期机制。

3,php中session的客户端存储机制

在上面我们的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没办法工作了。是的,确实是这样,php中的session的客户端存储机制只有cookie吗?不是的。既然我们的sessionid不能通过cookie传递到各个页面,那我们还有另外一个法宝,那就是通过页面get传值的方式。
php可以在cookie被禁用时自动通过get方式跨页面传递session,前提是php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另外一个页面时,php会自动在链接上添加sessionid参数,如:nenxtpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66,但是这样不够安全。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多