首页 / PHP / 如何在30分钟后使PHP会话到期?
如何在30分钟后使PHP会话到期?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在30分钟后使PHP会话到期?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2885字,纯文字阅读大概需要5分钟。
内容图文
![如何在30分钟后使PHP会话到期?](/upload/InfoBanner/zyjiaocheng/717/10ad5f675f684270adc3325f73e5132b.jpg)
我需要让会话保持30分钟,然后将其销毁.
解决方法:
您应该实现自己的会话超时.其他人提到的两个选项(session.gc_maxlifetime和session.cookie_lifetime)都不可靠.我会解释原因.
第一:
session.gc_maxlifetime
session.gc_maxlifetime specifies the number of seconds after which data will be seen as ‘garbage’ and cleaned up. Garbage collection occurs during session start.
但是垃圾收集器仅以session.gc_probability的概率除以session.gc_divisor开始.并且使用这些选项的默认值(分别为1和100),机会仅为1%.
好吧,您可以简单地调整这些值,以便更频繁地启动垃圾收集器.但是当垃圾收集器启动时,它将检查每个注册会话的有效性.这是成本密集型的??.
此外,当使用PHP的默认session.save_handler文件时,会话数据存储在session.save_path中指定的路径中的文件中.使用该会话处理程序,会话数据的年龄是根据文件的上次修改日期计算的,而不是上次访问日期:
Note: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other filesystem where atime tracking is not available. Since PHP 4.2.3 it has used mtime (modified date) instead of atime. So, you won’t have problems with filesystems where atime tracking is not available.
因此,当会话本身仍然被认为是有效的时,可能还会发生会话数据文件被删除,因为会话数据最近没有更新.
第二个:
session.cookie_lifetime
session.cookie_lifetime specifies the lifetime of the cookie in seconds which is sent to the browser. […]
恩,那就对了.这仅影响cookie生存期,会话本身可能仍然有效.但是服务器的任务是使会话无效,而不是客户端.所以这对任何事都没有帮助.实际上,将session.cookie_lifetime设置为0会使会话的cookie成为真正的session cookie,只有在浏览器关闭之前才有效.
结论/最佳解决方案:
最好的解决方案是实现自己的会话超时.使用表示最后一次活动(即请求)的时间的简单时间戳,并使用每个请求更新它:
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
// last request was more than 30 minutes ago
session_unset(); // unset $_SESSION variable for the run-time
session_destroy(); // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
每次请求更新会话数据也会更改会话文件的修改日期,以便垃圾收集器不会过早地删除会话.
您还可以使用额外的时间戳来定期重新生成会话ID,以避免对会话(如session fixation)的攻击:
if (!isset($_SESSION['CREATED'])) {
$_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
// session started more than 30 minutes ago
session_regenerate_id(true); // change session ID for the current session and invalidate old session ID
$_SESSION['CREATED'] = time(); // update creation time
}
笔记:
> session.gc_maxlifetime应至少等于此自定义到期处理程序的生命周期(本例中为1800);
>如果你想在30分钟的活动后而不是在开始后的30分钟后使会话失效,你还需要使用setcookie,其时间()为60 * 30,以使会话cookie保持活动状态.
内容总结
以上是互联网集市为您收集整理的如何在30分钟后使PHP会话到期?全部内容,希望文章能够帮你解决如何在30分钟后使PHP会话到期?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。