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 相关文章推荐
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
PHP警告Cannot use a scalar value as an array的解决方法
Jan 11 PHP
PHP的加密方式及原理
Jun 14 PHP
深入PHP autoload机制的详解
Jun 09 PHP
PHP中is_file()函数使用指南
May 08 PHP
PHP滚动日志的代码实现
Jun 10 PHP
smarty学习笔记之常见代码段用法总结
Mar 19 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
简单理解PHP的面向对象编程方式
May 17 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 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/09/30 PHP
PHP教程 基本语法
2009/10/23 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
Python开发编码规范
2006/09/08 Python
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
美国玩具公司:U.S.Toy
2018/05/19 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
聊城大学毕业生自荐书
2014/02/01 职场文书
厨房管理计划书
2014/04/27 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
服务宗旨标语
2014/07/01 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
民事代理词范文
2015/05/25 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python