• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-25) 12次浏览 已收录 0个评论
文章目录[隐藏]

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

请详细解释一下

回复内容:

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

请详细解释一下

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

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

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

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

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

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

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

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

<code>; 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-probabilitysession.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 t<i style="color:transparent">本文来源gaodai$ma#com搞$$代**码)网8</i><strong>搞代gaodaima码</strong>he 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-divisorsession.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-maxlifetimesession.gc_maxlifetime = 1440</code>

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

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

当你每次调用 session_start() 时 …

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

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

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

<code>session.gc_probability = 1session.gc_divisor = 1000</code>

就是说 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过期的时候。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:什么情况下会调用到session_destroy()

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址