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 cli 方式 在crotab中运行解决
Feb 08 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
PHP页面中文乱码分析
Oct 29 PHP
Codeigniter实现多文件上传并创建多个缩略图
Jun 12 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
php字符串函数学习之strstr()
Mar 27 PHP
php调整服务器时间的方法
Apr 03 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
PHP基于回溯算法解决n皇后问题的方法示例
Nov 07 PHP
PHP7 其他修改
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入门学习的几个不错的实例代码
2008/07/13 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
解决laravel session失效的问题
2019/10/14 PHP
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
Vue非父子组件通信详解
2017/06/12 Javascript
Vue计算属性的使用
2017/08/04 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
python实现保存网页到本地示例
2014/03/16 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
Django 框架模型操作入门教程
2019/11/05 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
教学实习自我评价
2014/01/28 职场文书
中专毕业生的自荐书
2014/07/01 职场文书