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 相关文章推荐
php创建基本身份认证站点的方法详解
Jun 08 PHP
分割GBK中文遭遇乱码的解决方法
Aug 09 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
PHP中file_exists()判断中文文件名无效的解决方法
Nov 12 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 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
PHP7匿名类用法分析
2016/09/26 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
python中常用的九种预处理方法分享
2016/09/11 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
django form和field具体方法和属性说明
2020/07/09 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
应届生护士求职信
2013/11/01 职场文书
优秀求职自荐信怎样写
2013/12/18 职场文书
旅游网创业计划书
2014/01/31 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
辩论赛主持词
2014/03/18 职场文书
欢迎词范文
2015/01/27 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python