网上很多人给出了解答: 修改配置文件中的 session.gc_maxlifetime 如果想了解更多 session 回收机制, 继续阅读(本文环境 php5.2)
概述: 每一次 php 请求, 会有 1/100 的概率 (默认值) 触发 session 回收如果 session 回收发生, 那就会检查 / tmp/sess_* 的文件, 如果最后的修改时间到现在超过了 1440 秒(gc_maxlifetime 的值), 就将其删除, 意味着这些 session 过期失效
1. session 在端 (一般是 with PHP module) 如何存在的?
默认的, php 会将 session 保存在 / tmp 目录下, 文件名为这个样子: sess_01aab840166fd1dc253e3b4a3f0b8381 每一个文件对应了一个 session(会话)
- more /tmp/sess_01aab840166fd1dc253e3b4a3f0b8381
- username|s:9:jiangfeng;admin|s:1:0;
- # 变量名 | 类型: 长度: 值
删除这里的 session 文件, 就表示对应的 session 失效了
2. session 在 client 端 (一般是浏览器) 如何存在的?
session 在浏览器端, 只需要保存 session ID(由 server 端生成的唯一 ID)就可以了有两种保存方式: 在 cookie 中在 url 里面如果 cookie 中保存 session ID, 就可以看到浏览器的 cookie 中有一个 PHPSESID 变量如果是 URL 传递的, 就可以看到形如:
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381 的 URL(在 server 端通过 session.use_cookies 来控制使用哪一种方式)
3. 在 server 端, php 如何判断 session 文件是否过期?
如果最后的修改时间到现在超过了 gc_maxlifetime(默认是 1440)秒, 这个 session 文件就被认为是过期了, 在下一次 session 回收的时候, 如果这个文件仍然没有被更改过, 这个 session 文件就会被删除(session 就过期了)
简单的说, 如果我登录到某网站, 如果在 1440 秒 (默认值) 内没有操作过, 那么对应的 session 就认为是过期了
所以, 修改 php.ini 文件中的 gc_maxlifetime 变量就可以延长 session 的过期时间了:(例如, 我们把过期时间修改为 86400 秒)
session.gc_maxlifetime = 86400
然后, 重启你的 web 服务 (一般是 apache) 就可以了
注意: php5 里面 session 过期使用了回收机制这里设置时间为 86400 秒, 如果 session 在 86400 秒内没有被修改过, 那么在下一次回收时才真的被删除
3. session 回收何时发生?
默认情况下, 每一次 php 请求, 就会有 1/100 的概率发生回收, 所以可能简单的理解为每 100 次 php 请求就有一次回收发生这个概率是通过以下参数控制的
- # 概率是 gc_probability/gc_pisor
- session.gc_probability = 1
- session.gc_pisor = 100
注意 1: 假设这种情况 gc_maxlifetime=120, 如果某个 session 文件最后修改时间是 120 秒之前, 那么在下一次回收 (1/100 的概率) 发生前, 这个 session 仍然是有效的
注意 2: 如果你的 session 使用 session.save_path 中使用别的地方保存 session,session 回收机制有可能不会自动处理过期 session 文件这时需要定时手动 (或者 crontab) 的删除过期的 session:cd /path/to/sessions; find -cmin +24 | xargs rm
4. 一些特殊情况
因为回收机制会检查文件的最后修改时间, 所以如果某个会话是活跃的, 但是 session 的内容没有改变过, 那么对应的 session 文件也就没有改变过, 回收机制会认为这是一个长时间没有活跃的 session 而将其删除这是我们不愿看到的, 可以通过增加如下的简单代码解决这个问题:
代码如下:
60) $_SESSION['last_access'] = time();?>
代码会每隔 60 秒, 尝试修改修改一次 session
总结: 如果想修改 session 过期时间, 修改变量 gc_maxlifetime 就可以了 php5 的 session 采用被动的回收机制 (garbage collection) 过期的 session 文件不会自己消失, 而是通过触发回收来处理过期的 session
来源: https://www.php1.cn/detail/php-8fd38efc6e.html