访问某个页面的时候,就会产生一个session id,session_destroy()会在什么时候调用呢?关闭浏览器?关闭此网页?还是网页转到另一个地址?session_destroy()是会自动调用的吧?
请详细解释一下
首先 … 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_probability
和 session.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 手册上 关于垃圾回收的章节 …
恩 … 就是这样啦 …
典型情况:用户注销的时候;session_id过期的时候。