`
flex_莫冲
  • 浏览: 1092606 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

PHP session回收机制及php.ini session生命期gc_maxlifetime配置/gc_maxlifetime无效

    博客分类:
  • php
 
阅读更多
由于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() 。否则将不能得到正确的结果
分享到:
评论

相关推荐

    详解php设置session(过期、失效、有效期)

    ini_set('session.gc_maxlifetime', 3600); // 设置为3600秒,即1小时后过期 ``` 若想让Session永不自动过期,可以在`php.ini`中调整如下三项设置: 1. `session.use_cookies` 设置为1,使用Cookie传递Session ID...

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

    默认情况下,PHP的session过期时间是由`session.gc_maxlifetime`配置项决定的,它定义了session数据在服务器上存活的最大时间,单位为秒。在PHP 5的默认配置中,这个值被设定为1440秒,即24分钟。如果想要自定义...

    php 如何设置一个严格控制过期时间的session

    可以修改php.ini的session.gc_maxlifetime来设置session的生命周期,但并不能保证在超过这一时间后session信息立即会删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动。那么大量的session在超过...

    PHP程序设计-3期(KC016) 3.12.2 session课后习题.doc

    默认情况下,这个值由`session.gc_maxlifetime`配置项在php.ini文件中定义,单位是秒。如果用户在指定的时间内没有与服务器交互,那么该Session就会被垃圾回收机制清理。要修改这个值,你可以按照以下方式操作: **...

    session php

    默认情况下,session生命周期为24分钟,可以通过`session.cookie_lifetime`和`session.gc_maxlifetime`配置来调整。 ```php ini_set('session.cookie_lifetime', 3600); // 设置cookie有效期为1小时 ini_set('...

    phpcms web发布session过期问题解决

    1. **检查PHP配置**:首先,查看php.ini文件中的`session.gc_maxlifetime`设置,确保其值符合项目需求。例如,如果希望Session在24小时内不失效,应设置为86400秒。同时,确认`session.cookie_lifetime`,它是浏览器...

    理解PHP中的Session及对Session有效期的控制

    例如,使用`session.cookie_lifetime`设置Cookie的生命周期,`session.gc_maxlifetime`来设置Session数据在服务器上的最大生存时间。此外,还可以在代码中动态设置Session的生命周期,例如: ```php ini_set('...

    php如何修改SESSION的生存存储时间的实例代码

    当服务器进行Session回收时,会根据`session.gc_maxlifetime`配置来检查Session文件的最后修改时间,如果超过这个时间间隔(默认1440秒),则会删除Session文件,从而导致Session失效。 Session在客户端的存在形式...

    php下使用无限生命期Session的方法

    ### PHP下使用无限生命期Session的方法 #### 一、引言 在PHP 4.0中引入了Session机制,这极大地便利了许多应用的开发过程,尤其是对于那些需要维护用户状态的应用,例如在线购物车系统、论坛等。Session可以帮助...

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

    - 此外,如果服务器配置了session垃圾回收机制(默认开启),即使设置了很长的session生命周期,超过`session.gc_maxlifetime`配置的值后,session数据仍可能被自动清除。为了避免这种情况,可以考虑禁用垃圾回收...

Global site tag (gtag.js) - Google Analytics