php中Session的生成机制、回收机制和存储机制探究


Posted in PHP onAugust 19, 2014

1、php中session的生成机制

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

php中Session的生成机制、回收机制和存储机制探究

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

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

这时文件就有内容了:
name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";

这时再看看cookie:

php中Session的生成机制、回收机制和存储机制探究

可以看到服务器为我们自动生成了一个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_probability/gc_divisor 。我们了解了服务器端的session过期机制,再来看看客户端的cookie的过期机制。

如果cookie失效了浏览器自然发送不了cookie到服务器,这时即使服务器的session文件存在也没用,因为PHP不知道要读取哪个session文件。我们知道PHP的cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的生命周期是多久呢?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制session的失效时间了。

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

由上面的介绍我们可以知道,如果用户关闭了cookie,那我们的session就完全没法工作了。是的,确实是这样。php中session的客户端存储机制只有cookie吗?不是的。既然我们的SESSIONID 不能通过cookie传递到各个页面,那我们还有另一个法宝,就是通过页面GET传值的方式。

PHP可以在cookie被禁用时自动通过GET方式跨页传递SESSIONID,前提是设置php.ini的session.use_trans_sid为1。这时当我们在客户端禁用了cookie时使用了session,并在当前页面通过点击链接到另一页面时,PHP会自动在链接上添加SESSIONID参数,像这样:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你应该看到了这种方式的缺点:好像不够安全啊。

PHP 相关文章推荐
php PDO中文乱码解决办法
Jul 20 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
php eval函数用法 PHP中eval()函数小技巧
Oct 31 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
php实现的漂亮分页方法
Apr 17 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
laravel5.6实现数值转换
Oct 23 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 PHP
php中多维数组按指定value排序的实现代码
Aug 19 #PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 #PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 #PHP
zend framework框架中url大小写问题解决方法
Aug 19 #PHP
深入理解PHP中的global
Aug 19 #PHP
PHP Session机制简介及用法
Aug 19 #PHP
phpExcel中文帮助手册之常用功能指南
Aug 18 #PHP
You might like
php 启动时报错的简单解决方法
2014/01/27 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
jcrop基本参数一览
2013/07/16 Javascript
jquery禁用右键示例
2014/04/28 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
求职自荐信格式
2013/12/04 职场文书
党员自我对照检查材料
2014/08/19 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
委托收款证明
2015/06/23 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
Golang jwt身份认证
2022/04/20 Golang