PHP中设置一个严格30分钟过期Session面试题的4种答案


Posted in PHP onJuly 30, 2014

今天在我的微博上发出一个问题:

我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵

为什么问这个问题呢?

1.我在stackoverflow上看到了有人讨论这个问题
2.想起来我经常问这个问题, 所以~~

在这里, 我来解答下这个题目.

第一种回答

那么, 最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlifetime, 这种回答是不正确的, 原因如下:

1. 首先, 这个PHP是用一定的概率来运行session的gc的, 也就是session.gc_probability和session.gc_divisor(介绍参看  PHP使用Session遇到的一个Permission denied Notice解决办法), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时, 运行Session gc. 不能保证到30分钟的时候一定会过期.

2. 那设置一个大概率的清理机会呢? 还是不妥, 为什么? 因为PHP使用stat Session文件的修改时间来判断是否过期, 如果增大这个概率一来会降低性能, 二来, PHP使用”一个”文件来保存和一个会话相关的Session变量, 假设我5分钟前设置了一个a=1的Session变量, 5分钟后又设置了一个b=2的Seesion变量, 那么这个Session文件的修改时间为添加b时刻的时间, 那么a就不能在30分钟的时候, 被清理了. 另外还有下面第三个原因.

3. PHP默认的(Linux为例), 是使用/tmp 作为Session的默认存储目录, 并且手册中也有如下的描述:

Note: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

也就是说, 如果有俩个应用都没有指定自己独立的save_path, 一个设置了过期时间为2分钟(假设为A), 一个设置为30分钟(假设为B), 那么每次当A的Session gc运行的时候, 就会同时删除属于应用B的Session files.

所以, 第一种答案是不”完全严格”正确的.

第二种答案

还有一种常见的答案是: 设置Session ID的载体, Cookie的过期时间, 也就是session.cookie_lifetime. 这种回答也是不正确的, 原因如下:

这个过期只是Cookie过期, 换个说法这点就考察Cookie和Session的区别, Session过期是服务器过期, 而Cookie过期是客户端(浏览器)来保证的, 即使你设置了Cookie过期, 这个只能保证标准浏览器到期的时候, 不会发送这个Cookie(包含着Session ID), 而如果通过构造请求, 还是可以使用这个Session ID的值.

第三种答案

使用memcache, redis等, okey, 这种答案是一种正确答案. 不过, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?

第四种答案

当然, 面试不是为了难道你, 而是为了考察思考的周密性. 在这个过程中我会提示出这些陷阱, 所以一般来说, 符合题意的做法是:

1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

最后, 有同学问, 为什么要设置30分钟的过期时间: 这个, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠??#63;

thanks :)

PHP 相关文章推荐
PHP中对数据库操作的封装
Oct 09 PHP
火车采集器 免费版使出收费版本功能实现原理
Sep 17 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
解析php类的注册与自动加载
Jul 05 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
PHP简单创建压缩图的方法
Aug 24 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 #PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 #PHP
PHP return语句的另一个作用
Jul 30 #PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 #PHP
php CI框架插入一条或多条sql记录示例
Jul 29 #PHP
两种设置php载入页面时编码的方法
Jul 29 #PHP
php ci框架中加载css和js文件失败的原因及解决方法
Jul 29 #PHP
You might like
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python冒泡排序注意要点实例详解
2016/09/09 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
python 修改本地网络配置的方法
2019/08/14 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
一些高难度的SQL面试题
2016/11/29 面试题
客服部工作职责范本
2014/02/14 职场文书
材料加工工程求职信
2014/02/19 职场文书
质量承诺书格式
2014/05/20 职场文书
国际贸易求职信
2014/07/05 职场文书
观看信仰心得体会
2014/09/04 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
Python采集股票数据并制作可视化柱状图
2022/04/04 Python
Python中itertools库的四个函数介绍
2022/04/06 Python