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文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
mac下安装nginx和php
Nov 04 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
May 10 PHP
PHP面向对象教程之自定义类
Jun 10 PHP
php获取apk包信息的方法
Aug 15 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
php实现小程序支付完整版
Oct 09 PHP
PHP保留两位小数的几种方法
Jul 24 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
我的论坛源代码(三)
2006/10/09 PHP
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
js实现简单点赞操作
2020/03/17 Javascript
python strip()函数 介绍
2013/05/24 Python
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
Python实现微信机器人的方法
2019/09/06 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
理工类毕业自我鉴定
2014/02/20 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
Python+Tkinter打造签名设计工具
2022/04/01 Python
联想win10摄像头打不开怎么办?win10笔记本摄像头打不开解决办法
2022/04/08 数码科技
nginx静态资源的服务器配置方法
2022/07/07 Servers