第一个回答嗯,最常见的回答是:设置session的过期时间,也就是session.gc_maxlifetime,这个回答不正确,原因如下:首先,这个PHP是使用一定概率来运行session的gc的,也就是session.gc_probability和session.gc_divisor(介绍可以参考小概率NoticeofSessionGc深入理解PHP原则),默认值分别为1和100,即一个Session启动时PHP有1%的几率运行Sessiongc。不能保证它会在30分钟后过期。设置一个高概率的清理机会如何?还是不合适,为什么?因为PHP使用statSession文件的修改时间来判断是否过期。如果你增加这个概率,它会降低性能。其次,PHP使用“一个”文件来保存与会话相关的Session变量。假设我在5分钟前设置了一个sessionA=1的Session变量,5分钟后设置了一个Seesion变量b=2,那么这个Session文件的修改时间就是添加b的时间,那么30后就无法清除a了分钟。另外还有下面第三个原因。在PHP中(以Linux为例)默认使用/tmp作为Session的默认存放目录,手册中也有如下说明:注意:如果不同的脚本session.gc_maxlifetime值不同但共享相同存储会话数据的地方,具有最低值的脚本清理数据。在这种情况下,将此指令与session.save_path一起使用。也就是说如果有两个应用程序没有指定自己独立的save_path,一个设置过期时间为2分钟(假设为A),一个为30分钟(假设为B),那么每次当A的Sessiongc运行时,属于应用程序B的Session文件会同时被删除。因此,第一个答案不是“完全严格”正确的。第二个答案也是一个常见的答案:设置SessionID、CookieExpiration时间的载体,即session.cookie_lifetime。这个答案也是不正确的,原因如下:这个过期只是cookie的过期。(浏览器)确保即使你设置了cookie过期,这也只能保证标准浏览器在过期时不会发送cookie(包括SessionID),如果构造请求,Session仍然可以使用的ID的值。第三个答案使用了memcache、redis等,okey,这个答案是正确答案。但是,很明显提问者肯定会继续问你,如果你只用PHP呢?第四个答案当然是,面试不是为了你,而是为了考察思维的透彻程度。在这个过程中,我会提醒大家注意这些陷阱,所以一般来说,符合题意的做法是:设置cookie过期时间为30分钟,同时设置Session的生存期也是30分钟。自己为每个会话值添加时间戳。每次访问前,判断时间戳。
