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数组实例总结与说明
Aug 23 PHP
解析php如何将日志写进syslog
Jun 28 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
分享一个漂亮的php验证码类
Sep 29 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
php批量删除操作代码分享
Feb 26 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
PHP实现的贪婪算法实例
Oct 17 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
Mar 07 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
星际实力自我测试
2020/03/04 星际争霸
php 信息采集程序代码
2009/03/17 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
php缓冲输出实例分析
2015/01/05 PHP
php截取字符串函数分享
2015/02/02 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
实例讲解PHP表单处理
2019/02/15 PHP
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
JS中的BOM应用
2018/02/02 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python函数参数操作详解
2018/08/03 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
python 爬虫请求模块requests详解
2020/12/04 Python
selenium如何定位span元素的实现
2021/01/13 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
新学期家长寄语
2014/01/19 职场文书
公司活动方案范文
2014/03/06 职场文书
追悼会悼词大全
2015/06/23 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle