php中的session过期思考一二

看了php开发组成员鸟哥的一篇关于php设置session过期(http://www.laruence.com/2012/01/10/2469.html)的文章

他也说了一般人的回答的几个答案, 回答别人的问题也是自己思考的一个过程,和自己写blog,用码字来促使自己思考一样,

所以我写下这篇读书笔记- -!

他的问题

“我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多,

特别适合考察基本功是否扎实, 谁来回答试试”

一:首先

让我们回想一下session的诞生,这个要跟http的特性说起来,因为http是一个无状态的协议,访问一次之后,链接就断开了,

为了client跟server能建立一种联系,就这样cookie应运而生了, 那他是怎么从客户端传递到服务器端的呢,当然是通过http协议

来传输的, session就是通过cookie传输的到服务器端的

有图有真相

二:session在php.ini中的设置

第一种方案 (错误答案)

有一个过期时间 session.gc_maxlifetime , 这个可以设置session的过期时间,假如我们设置30分钟过期,但是看鸟哥的blog,说这是一个小概率事件,它是由2个参数决定的

session.gc_probilitysession.gc_divisor(参见:http://www.laruence.com/2011/03/29/1949.html), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时,

运行Session gc. 不能保证到30分钟的时候一定会过期.

然后鸟哥讲了 session在 类 *unix服务器上, php是怎么判断session过期时间的:

在服务器上,每一个session是独立存放在一个文件中的,php.ini中有设置 session.save_path,类*unix一般是放在/tmp目下的,而计算session过期时间是通过

stat session的文件修改日期,他说了如果修改为大概率世间出现的问题:

:性能问题

:如果session文件写入 a = 10, 5分钟后过期, 然后过了3分钟又写入b = 12,

那么这个文件的修改日期就变了,那么就是session过期的时间也变了, 那么a就不能在5分钟后清除

:还有第三个原因,我复制过来

3. PHP默认的(Linux为例), 是使用/tmp 作为Session的默认存储目录, 并且手册中也有如下的描述:

Note: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

也就是说, 如果有俩个应用都没有指定自己独立的save_path, 一个设置了过期时间为2分钟(假设为A), 一个设置为30分钟(假设为B), 那么每次当A的Session gc运行的时候, 就会同时删除属于应用B的Session files.

第二种 (错误答案)

设置 cookie的过期时间

session.cookie_lifetime. 这个参数来设置cookie的过期时间, 这个更不靠谱, cookie是客户端的, session是服务端的

第三种:(对的)

用memcached redis这种k-v数据库来存储session

第四种: (最好的答案)

复制他的内容, 我有点懒

当然, 面试不是为了难道你, 而是为了考察思考的周密性. 在这个过程中我会提示出这些陷阱, 所以一般来说, 符合题意的做法是:

1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

最后, 有同学问, 为什么要设置30分钟的过期时间: 这个, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠劵?

最后放一段代码, 我木有测试的代码

 1 function SessExpire($expire = 0)
 2 {
 3     if($expire == 0){
 4         $expire = ini_get("session.gc_maxlifetime");
 5     } else {
 6         ini_set("session.gc_maxlifetime", $expire);
 7     }
 8
 9     if(empty($_COOKIE[PHPSESSID]){
10         session_set_cookie_params($expire);
11         session_start();
12     } else {
13         session_start();
14         setcookie(PHPSESSID, session_id(), time() + $expire);
15     }
16 }

php中的session过期思考一二

时间: 2024-10-11 10:50:16

php中的session过期思考一二的相关文章

asp中设置session过期时间方法总结

http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载 asp中默认session过期时间为20分钟,很多情况下不够,今天有客户要求很多就要重新登录了,所以准备了这篇文章,方便需要的朋友 如果程序中没有设置session的过期时间,那么session过期时间就会按照IIS设置的过期时间来执行,IIS中session默认过期时间为20分钟,IIS中session时间可以更改 时间设置要放在前面

java中设置session过期时间

Web容器 apache-tomcat-8.0.26\conf\web.xml中设置 <session-config> <!-- 时间单位为分钟 --> <session-timeout>30</session-timeout> </session-config> Web工程 在项目工程的web.xml中设置 <session-config> <!-- 时间单位为分钟 --> <session-timeout>

大型Web 站点 Asp.net Session过期你怎么办

在 WEB 系统中. 我们通常会用session来保存一些简单可是却非常重要的信息.比方Asp.net中常常会用Session来保存用户登录信息,比方UserID.为了解决 WEB场大家採用了把session存在DB中,session过期大家一般都採用页面跳转,即再次登录,login后又返回页面. 个人认为以上设计不是非常好, 对于web场,假设我们把session存在DB那么新能应该比存内存要慢.所以推荐用分布式缓存的方式来存取Session. 对于Session过期我建议採用cookie来做

大型Web 网站 Asp.net Session过期你怎么办

在 WEB 系统中, 我们一般会用session来保存一些简单但是却很重要的信息.比如Asp.net中经常会用Session来保存用户登录信息,比如UserID.为了解决 WEB场大家采用了把session存在DB中,session过期大家一般都采用页面跳转,即再次登录,login后又返回页面.个人觉得以上设计不是很好, 对于web场,如果我们把session存在DB那么新能应该比存内存要慢,所以推荐用分布式缓存的方式来存取Session. 对于Session过期我建议采用cookie来做.在大

解决session过期后登录页面嵌套在框架中的问题

只要在登录页面中加入一下脚本即可: <script language="text/javascript"> //在嵌套时,就刷新上级窗口 if(window.parent!=window){ window.parent.location.reload(true); } </script> 解决session过期后登录页面嵌套在框架中的问题,布布扣,bubuko.com

转:php中实现精确设置session过期时间的方法

原文来自于:http://www.jb51.net/article/52309.htm 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间. 对此,可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟)这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用!其实不是不起作用,而是因为系统默认: ? 1 2 session.gc_pr

PHP中的session永不过期的解决思路及实现方法分享

打开php.ini设置文件,修改三行如下: 1.session.use_cookies  把这个的值设置为1,利用cookie来传递sessionid  2.session.cookie_lifetime  这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以PHP的 session不能永久使用! 那么我们把它设置为一个我们认为很大的数字吧,999999999怎么样,可以的!就这样.  3.session.gc_maxl

如何严格设置php中session过期时间

如何严格限制session在30分钟后过期!1.设置客户端cookie的lifetime为30分钟:2.设置session的最大存活周期也为30分钟:3.为每个session值加入时间戳,然后在程序调用时进行判断: 至于为什么,我们首先来了解下php中session的基本原理: PHP中的session有效期默认是1440秒(24分钟),也就是说,客户端超过24分钟没有刷新,当前session就会失效.当然如果用户关闭了浏览器,会话也就结束了,Session自然也不存在了!大家知道,Sessio

PHP session过期时间

如何设置一个严格30分钟过期的Session 今天在我的微博(Laruence)上发出一个问题: 我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵 为什么问这个问题呢? 1. 我在Twitter上看到了有人讨论这个问题, 2 想起来我经常问这个问题, 所以~~ 在这里, 我来解答下这个题目. 第一种回答 那么, 最常见的一种回答是: 设置Session的过期时