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
PHP文件打开、关闭、写入的判断与执行代码
May 24 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php的dl函数用法实例
Nov 06 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
php进程daemon化的正确实现方法
Sep 06 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 class类的用法详细总结
2013/10/17 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
Python 探针的实现原理
2016/04/23 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
PyQt5响应回车事件的方法
2019/06/25 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
食品工程专业求职信
2014/06/15 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技