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 相关文章推荐
WIN98下Apache1.3.14+PHP4.0.4的安装
Oct 09 PHP
简单的php 验证图片生成函数
May 21 PHP
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
深入理解:XML与对象的序列化与反序列化
Jun 08 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
Jun 25 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
PHP strip_tags保留多个HTML标签的方法
May 22 PHP
PHP微信开发之查询城市天气
Jun 23 PHP
php使用curl代理实现抓取数据的方法
Feb 03 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 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入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
文明礼仪小标兵事迹
2014/01/12 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
企业授权委托书范本
2014/04/02 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
安全生产年活动总结
2014/08/29 职场文书
心得体会的写法
2014/09/05 职场文书
教师自我剖析材料
2014/09/29 职场文书
校园广播稿100字
2014/10/06 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
Python time库的时间时钟处理
2021/05/02 Python
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技
Win11更新失败并提示0xc1900101
2022/04/19 数码科技