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 相关文章推荐
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
sphinx增量索引的一个问题
Jun 14 PHP
php Xdebug的安装与使用详解
Jun 20 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
Zend Framework分发器用法示例
Dec 11 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
wordpress网站转移到本地运行测试的方法
Mar 15 PHP
关于laravel框架中的常用目录路径函数
Oct 23 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
Apr 26 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 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
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
2020/04/28 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python自动格式化json文件的方法
2015/03/11 Python
详解python中asyncio模块
2018/03/03 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
Python如何安装第三方模块
2020/05/28 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
保证书格式范文
2014/04/28 职场文书
2015年个人思想总结
2015/03/09 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
关于python爬虫应用urllib库作用分析
2021/09/04 Python