一、Session 回收机制
由于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删除。它的工作原理是这样的:
1.用户访问并登陆网站,这时候后台会调用session_start来尝试生成一个会话(如果已经有会话,则相当于一次有效会话请求)。
2.对于这样的每一次有效会话请求(Request),apache的php模块会根据session相关的全局变量gc_probability/gc_divisor =>计算出启动GC的概率,并由此概率来决定在这次请求中是否应该启动GC。举例来说,session.gc_probability的缺省值为1,session.gc_divisor的缺省值为100,则启动“垃圾回收”器的概率是1%,这就意味着在每100次请求中,会有可能清理一次过期会话。
3.如果GC启动,则GC会扫描当前会话所在路径(session.save_path)下的所有会话文件,并根据另外一个全局变量session.gc_maxlifetime的多少来判断哪些session已经过期(“当前时间”与“会话文件的atime或者mtime”之间的差大于gc_maxlifetime:过期),并删除这些过期的session。
二、gc_maxlifetime无效的情况
在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。当服务器上有多个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。
三、其他文章
相关推荐
Cookie、Session机制详解 Cookie机制是Web程序中常用的技术,用来跟踪用户的整个会话。Cookie通过在客户端记录信息确定用户身份。Cookie机制可以弥补HTTP协议的无状态特性,使服务器可以从客户端获取用户信息,以便...
#### 二、术语解释:Session 在不同的上下文中,"session"这个词有着不同的含义,尤其是在网络通信和Web开发领域。通常,"session"可以指代: 1. **一次完整的交互过程**:例如,从打开浏览器到关闭浏览器这段时间...
### Cookie机制与Session机制的区别及关系 在现代网络应用中,服务器端与客户端之间的状态保持是至关重要的,尤其是在无状态的HTTP协议下。Cookie机制与Session机制是两种常用的状态管理方式,它们各自拥有独特的...
山石网科防火墙session机制
【Cookie与Session机制】在Web开发中,会话跟踪是必不可少的技术,用于区分不同用户的操作。常见的会话跟踪手段有Cookie和Session。Cookie是通过在客户端存储信息来识别用户身份,而Session则是在服务器端存储信息来...
cookie 机制和 session 机制的区别 cookie 机制和 session 机制是两种常用的Web会话跟踪机制,虽然它们都可以实现会话跟踪,但它们的实现机制和应用场景却有所不同。 首先,cookie 机制是一种客户端保持状态的方案...
### Cookie与Session机制详解 #### 一、Cookie与Session的概念及区别 在Web开发中,为了保持用户的状态信息,通常会用到两种技术:Cookie和Session。这两种技术都是用来跟踪用户的浏览活动,但它们的工作原理有所...
### Cookie机制与Session机制的区别 #### 一、概念解析 **Cookie** 和 **Session** 是两种常见的用于在Web应用程序中维护用户状态的技术。 - **Cookie**:是一种客户端存储技术,服务器可以通过HTTP响应向客户端...
【标题】:“session机制与cookie机制(来源于IT168)” 【描述】:这篇文章讨论了session和cookie在Web开发中的重要角色,解释了它们如何帮助维持用户状态,并且介绍了这两种机制的基本概念。 【标签】:“session...
目录: 一、术语session 二、HTTP协议与状态保持 三、理解cookie机制 ...四、理解session机制 五、理解javax.servlet.http.HttpSession 六、HttpSession常见问题 七、跨应用程序的session共享 八、总结
PHP 中 Session 机制的研究与应用 PHP 中的 Session 机制是指跟踪和识别用户的机制,用于记录用户信息。Session 是一种特定时间概念,能够存储当前浏览器窗口打开的任何窗口的用户信息。这段有始有终的一系列动作/...
重写session机制,默认session是以临时文件形式存储在服务器,将session写入数据库,建表和注释写的都很清晰,已测试
【全面理解Session机制】 Session机制是Web开发中用于维持客户端(浏览器)与服务器之间状态的一种技术。在HTTP协议中,由于其无状态性,每次请求之间不会共享任何信息,因此,为了实现用户登录状态的保持或者其他...
Servlet Session机制详解,如题,详细描述Session的原理,及使用方法,附部分代码
在PHP编程中,Session是一种非常重要的机制,用于在用户的不同页面请求之间保持状态。它允许开发者存储用户信息,如登录状态、购物车内容等,即使用户在网站上浏览不同的页面,也能保持这些信息的连续性。现在我们来...
【session机制】是一种在Web应用程序中用于保持客户端与服务器之间状态的技术。在Web开发中,由于HTTP协议本身的无状态性,即服务器不保留关于客户端的任何信息,每次请求都被视为独立的事务。为了实现诸如购物车、...
在Web开发中,PHP的Session机制是一种非常重要的用户状态管理工具,它允许开发者在用户的浏览器会话之间存储数据,确保在不同页面间传递信息。本篇文章将深入探讨Session的工作原理以及其在实际应用中的操作。 ### ...
该资源的主要讲解了session的主要用法,工作原理,安全机制,单点登录,在大型web中的应用。主要为对session不甚了解的同志,价值含量较高,也较为实用。
Cookie 与 Session 机制 Cookie 机制是 Web 程序中常用的技术,用来跟踪用户的整个会话。Cookie 通过在客户端记录信息确定用户身份。下面是 Cookie 机制的详细说明: 1. 什么是 Cookie? Cookie 意为“甜饼”,是...
在PHP中,Session是一种非常重要的会话管理机制,它允许开发者在用户的不同页面请求之间保持状态。本篇文章将深入探讨如何在PHP中设置Session,包括过期、失效以及有效期的管理。 首先,让我们关注`session.save_...