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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
php下封装较好的数字分页方法
Nov 23 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
Aug 31 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
简单谈谈favicon
Jun 10 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
PHP+Ajax实现的博客文章添加类别功能示例
Mar 29 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
Sep 26 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 PHP
PHP重载基础知识回顾
Sep 10 PHP
PHP中多字节字符串操作实例详解
Aug 23 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服务器页面间跳转实现方法
2012/08/02 PHP
php发送post请求的三种方法
2014/02/11 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
vue debug 二种方法
2018/09/16 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
分享一个常用的Python模拟登陆类
2015/03/29 Python
python实现的希尔排序算法实例
2015/07/01 Python
Python脚本获取操作系统版本信息
2016/12/17 Python
Python yield 使用方法浅析
2017/05/20 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
2015年公民道德宣传日活动总结
2015/03/23 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书