php中session过期时间设置及session回收机制介绍


Posted in PHP onMay 05, 2014

网上很多人给出了解答:修改配置文件中的session.gc_maxlifetime。如果想了解更多session回收机制,继续阅读。(本文环境php5.2)

概述:每一次php请求,会有1/100的概率(默认值)触发“session回收”。如果“session回收”发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值),就将其删除,意味着这些session过期失效。

1. session在端(一般是 with PHP module)如何存在的?

默认的,php会将session保存在/tmp目录下,文件名为这个样子:sess_01aab840166fd1dc253e3b4a3f0b8381。每一个文件对应了一个session(会话)。
more /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381
username|s:9:”jiangfeng”;admin|s:1:”0″;
#变量名|类型:长度:值

删除这里的session文件,就表示对应的session失效了。

2. session在client端(一般是浏览器)如何存在的?

session在浏览器端,只需要保存session ID(由server端生成的唯一ID)就可以了。有两种保存方式:在cookie中、在url里面。如果cookie中保存session ID,就可以看到浏览器的cookie中有一个PHPSESID变量。如果是URL传递的,就可以看到形如:
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381的URL。(在server端通过session.use_cookies来控制使用哪一种方式)

3. 在server端,php如何判断session文件是否过期?

如果”最后的修改时间”到”现在”超过了gc_maxlifetime(默认是1440)秒,这个session文件就被认为是过期了,在下一次session回收的时候,如果这个文件仍然没有被更改过,这个session文件就会被删除(session就过期了)。

简单的说,如果我登录到某网站,如果在1440秒(默认值)内没有操作过,那么对应的session就认为是过期了。

所以,修改php.ini文件中的gc_maxlifetime变量就可以延长session的过期时间了:(例如,我们把过期时间修改为86400秒)
session.gc_maxlifetime = 86400

然后,重启你的web服务(一般是apache)就可以了。

注意:php5里面session过期使用了回收机制。这里设置时间为86400秒,如果session在86400秒内没有被修改过,那么在下一次“回收”时才真的被删除。

3. session“回收”何时发生?

默认情况下,每一次php请求,就会有1/100的概率发生回收,所以可能简单的理解为“每100次php请求就有一次回收发生”。这个概率是通过以下参数控制的
#概率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100

注意1:假设这种情况gc_maxlifetime=120,如果某个session文件最后修改时间是120秒之前,那么在下一次回收(1/100的概率)发生前,这个session仍然是有效的。

注意2:如果你的session使用session.save_path中使用别的地方保存session,session回收机制有可能不会自动处理过期session文件。这时需要定时手动(或者crontab)的删除过期的session:cd /path/to/sessions; find -cmin +24 | xargs rm

4. 一些特殊情况

因为回收机制会检查文件的“最后修改时间”,所以如果某个会话是活跃的,但是session的内容没有改变过,那么对应的session文件也就没有改变过,回收机制会认为这是一个长时间没有活跃的session而将其删除。这是我们不愿看到的,可以通过增加如下的简单代码解决这个问题:

<?phpif(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60) $_SESSION['last_access'] = time();?>

代码会每隔60秒,尝试修改修改一次session。

总结:如果想修改session过期时间,修改变量gc_maxlifetime就可以了。php5的session采用被动的回收机制(garbage collection)。过期的session文件不会自己消失,而是通过触发“回收”来处理过期的session。

PHP 相关文章推荐
珊瑚虫IP库浅析
Feb 15 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
Youku 视频绝对地址获取的方法详解
Jun 26 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
php-redis中的sort排序函数总结
Jul 08 PHP
PHP加密解密函数详解
Oct 28 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
laravel手动创建数组分页的实现代码
Jun 07 PHP
使用php语句将数据库*.sql文件导入数据库
May 05 #PHP
PHP判断是否有Get参数的方法
May 05 #PHP
php快递单号查询接口使用示例
May 05 #PHP
JS异常处理try..catch语句的作用和实例
May 05 #PHP
php生成短网址示例
May 05 #PHP
PHP zip扩展Linux下安装过程分享
May 05 #PHP
PHP常用的缓存技术汇总
May 05 #PHP
You might like
可以在线执行PHP代码包装修正版
2008/03/15 PHP
php获取字段名示例分享
2014/03/03 PHP
PHP实现货币换算的方法
2014/11/29 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
促销活动策划方案
2014/01/12 职场文书
小学生家长评语集锦
2014/01/30 职场文书
个人求职信格式范文
2015/03/20 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
教师读书活动心得体会
2016/01/14 职场文书
八年级历史教学反思
2016/02/19 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python
Go使用协程交替打印字符
2021/04/29 Golang