php设置session过期时间
㈠ php中设置一个严格30分钟过期Session面试题的4种答案
今天在我的微博上发出一个问题:
我在面试的时候,
经常会问一个问题:
“如何设置一个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分钟就过期的优惠劵?
thanks
:)
㈡ php怎么设置某个session的过期时间
可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟) 这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用! 其实不是不起作用,而是因为系统默认: session.gc_probability = 1 session.gc_divisor = 1000...
楼主去后盾人看看,那的学习视频应该可以帮助你解决问题,以及你其他的不太懂的问题
㈢ 为什么设置php的session
一、介绍
PHP中session默认过期时间是1440S,超过这个时间没有页面刷新或者用户关闭了浏览器,session就会失效。
二、设置
session文件存储在服务器端,通过保存在用户端的SessionId与服务键液戚器进行交互,session的配置文件是php.ini,相关参数如下:
1.session.use_cookies = 1,默认1,代表SessionId通过cookie来传递,否则会用Query_String
2.session.name = PHPSESSID,默认PHPSESSID,代表SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递
3.session.cookie_lifetime = 604800,是SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID立即失效,这里我设置了7天
4.session.gc_maxlifetime = 604800,默认是1440,代表session在服务器端保留的时间,超过这个时间就会失效。这里我设置了7天,与客户端的cookie有效时间一致
三、其他情况
一般情况下把这四个值设置好之后就可以更改session的有效期了,但是当多个站点的session文件都保存在公用埋桐临时路径时,由于php的GC(Garbage Collector)机制,某个站点启动垃圾回收机制,都会把公用临时文件目录下的文件全部清除,这就会导致稿陵session失效,解决方法就是更改php.ini里session文件的保存路径:
session.save_path=‘你的路径’;