由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改) 的值,来决定是否启动一个GC(Garbage Collector)。默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。
GC的工作,就是扫描所有的session信息, 用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删 除。
那为什么会发生gc_maxlifetime无效的情况呢?
在默认情况下,session信息会以文本文件的形式,被保存在系统 的临时文件目录中。在Linux下,这一路径通常为\tmp,在Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应用时, 它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。
问 题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删 除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。
找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。
还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到 删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。解决这 个问题的一个方法是,把session.gc_probability/session.gc_divisor的机率提高,如果提到100%,就会彻底解 决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了gc_maxlifetime,就清 空当前session。
Tiwer
在window下設置wamp的session時間,即使設置了10秒超時,到時間都不會清空session。
linux的設置:
在apache1.2以上的版本中,可以在httpd.conf里面设置:
KeepAlive on
KeepAliveTimeout 15
session.auto_start 开启就自动完成了session_start()
php.ini 中 session.auto_start 开启与关闭的区别
区别就在于在用SESSION前是否需要session_start();
当session.auto_start = on
时,执行 session_start() 将产生新的 session_id
session.auto_start = on 的优点在于,任何时候都不会因忘记执行 session_start() 或 session_start() 在程序里的位置不对,而导致错误
缺点在于,如果你使用的是第三方代码,则必须删去其中的全部 session_start() 。否则将不能得到正确的结果
分享到:
相关推荐
ini_set('session.gc_maxlifetime', 3600); // 设置为3600秒,即1小时后过期 ``` 若想让Session永不自动过期,可以在`php.ini`中调整如下三项设置: 1. `session.use_cookies` 设置为1,使用Cookie传递Session ID...
默认情况下,PHP的session过期时间是由`session.gc_maxlifetime`配置项决定的,它定义了session数据在服务器上存活的最大时间,单位为秒。在PHP 5的默认配置中,这个值被设定为1440秒,即24分钟。如果想要自定义...
可以修改php.ini的session.gc_maxlifetime来设置session的生命周期,但并不能保证在超过这一时间后session信息立即会删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动。那么大量的session在超过...
默认情况下,这个值由`session.gc_maxlifetime`配置项在php.ini文件中定义,单位是秒。如果用户在指定的时间内没有与服务器交互,那么该Session就会被垃圾回收机制清理。要修改这个值,你可以按照以下方式操作: **...
默认情况下,session生命周期为24分钟,可以通过`session.cookie_lifetime`和`session.gc_maxlifetime`配置来调整。 ```php ini_set('session.cookie_lifetime', 3600); // 设置cookie有效期为1小时 ini_set('...
1. **检查PHP配置**:首先,查看php.ini文件中的`session.gc_maxlifetime`设置,确保其值符合项目需求。例如,如果希望Session在24小时内不失效,应设置为86400秒。同时,确认`session.cookie_lifetime`,它是浏览器...
例如,使用`session.cookie_lifetime`设置Cookie的生命周期,`session.gc_maxlifetime`来设置Session数据在服务器上的最大生存时间。此外,还可以在代码中动态设置Session的生命周期,例如: ```php ini_set('...
当服务器进行Session回收时,会根据`session.gc_maxlifetime`配置来检查Session文件的最后修改时间,如果超过这个时间间隔(默认1440秒),则会删除Session文件,从而导致Session失效。 Session在客户端的存在形式...
### PHP下使用无限生命期Session的方法 #### 一、引言 在PHP 4.0中引入了Session机制,这极大地便利了许多应用的开发过程,尤其是对于那些需要维护用户状态的应用,例如在线购物车系统、论坛等。Session可以帮助...
- 此外,如果服务器配置了session垃圾回收机制(默认开启),即使设置了很长的session生命周期,超过`session.gc_maxlifetime`配置的值后,session数据仍可能被自动清除。为了避免这种情况,可以考虑禁用垃圾回收...