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 相关文章推荐
rephactor 优秀的PHP的重构工具
Jun 09 PHP
判断php数组是否为索引数组的实现方法
Jun 13 PHP
php的慢速日志引起的Mysql错误问题分析
May 13 PHP
PHP按指定键值对二维数组进行排序的方法
Dec 22 PHP
分享PHP计算两个日期相差天数的代码
Dec 23 PHP
php封装的mysqli类完整实例
Oct 18 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
php实现微信支付之企业付款
May 30 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 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/05/07 PHP
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
php分页函数完整实例代码
2014/09/22 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
Prototype Template对象 学习
2009/07/19 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
Python第三方库的安装方法总结
2016/06/06 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
实例介绍Python中整型
2019/02/11 Python
python @classmethod 的使用场合详解
2019/08/23 Python
Python中logging日志库实例详解
2020/02/19 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
详解Django配置JWT认证方式
2020/05/09 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
英语自我介绍演讲稿
2014/09/01 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
平遥古城导游词
2015/02/03 职场文书
2015年药店工作总结
2015/04/20 职场文书
标枪加油稿
2015/07/22 职场文书
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技