什么情况下会调用到session_destroy()

15次阅读

访问某个页面的时候,就会产生一个session id,session_destroy()会在什么时候调用呢?关闭浏览器?关闭此网页?还是网页转到另一个地址?session_destroy()是会自动调用的吧?

请详细解释一下

imzhi

首先 … session_destory() 是一个函数 …

这个函数在任何情况下都不会被 php 引擎自动调用 … 只能你手工去调用 …

php 内部存在着清理 session 的机制 … 但与这个函数完全无关 …

如果你想问的是什么时候该手工调用这个函数 …答案就是在你想完全清理掉当前 session 的时候 …

问题里面提及的几种情况 … 不管是关闭网页也好 … 关闭浏览器也罢 … 甚至你把浏览器删掉重装了 …

都不会影响到已经生成的 session … 一言以蔽之 … 所有浏览器行为都不会导致 session 被自动销毁 …

那么 … php 到底是如何清理 session 的呢 ..?

仔细去读 php.ini … 你可以发现如下几行 …

; Defines the probability that the 'garbage collection' process is started
; on every session initialization. The probability is calculated by using
; gc_probability/gc_divisor. Where session.gc_probability is the numerator
; and gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% 
; chance the gc will run on any give request.
; Default Value: 1
; Development Value: 1
; Production Value: 1
; http://php.net/session.gc-probability
session.gc_probability = 1

; Defines the probability that the 'garbage collection' process is started 
; on every session initialization. The probability is calculated by using 
; the following equation: gc_probability/gc_divisor. Where session.gc_probability 
; is the numerator and session.gc_divisor is the denominator in the equation. 
; Setting this value to 1 when the session.gc_divisor value is 100 will give you 
; approximately a 1% chance the gc will run on any give request. Increasing this 
; value to 1000 will give you a 0.1% chance the gc will run on any give request. 
; For high volume production servers, this is a more efficient approach.
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
; http://php.net/session.gc-divisor
session.gc_divisor = 1000

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
; http://php.net/session.gc-maxlifetime
session.gc_maxlifetime = 1440

其实英文的注释已经说得很明白了 … 但如果你不想看 … 我也可以解释给你听 …

由于 php 的工作机制 … 它本身不会提供 daemon 来定时扫描 session 信息并判断其是否失效 …

当你每次调用 session_start() 时 …

php 会根据 session.gc_probabilitysession.gc_divisor 来决定是否启用 Garbage Collector …

Garbage Collector 顾名思义 … 被叫做 垃圾回收器 … 也就是俗称的 GC …

具体一些讲 … 在我刚刚贴的配置文件里 …

session.gc_probability = 1
session.gc_divisor = 1000

就是说 php 会有千分之一的概率会启动垃圾回收 …

而垃圾回收的工作就是在 session 存储路径 session.save_path 下扫描所有存在的 session …

然后用当前时间减去每个 session 的最后修改时间再跟 session.gc_maxlifetime 参数进行比较 …

如果某个 session 的生存时间超过了 session.gc_maxlifetime 的设定值就把它销毁掉 …

事实上这个过程完全是 php 引擎的行为 … 和你的程序无关 … 和用户做了什么也无关 …

用户关闭浏览器再开 … 因为 cookie 失效他会获得一个新的 session …

但这并不代表他原来的 session 就被销毁了 … 那个 session 依然在服务器上存在 …

如果他手动把名字等于 session.name 的那个 cookie 的值改回之前的 session_id()

还是可以重新获得之前的那个 session 的 …

另外一种情况 … 如果一个用户获得 session 之后长时间没有任何动作 …

他就可能因为其他用户触发了垃圾回收而丢失掉自己的 session …

大体来说就是如此 … 更加细节的东西 … 你可以参考 php 手册上 关于垃圾回收的章节

恩 … 就是这样啦 …

Sunyanzi

典型情况:用户注销的时候;session_id过期的时候。

felix021

正文完