当前位置: 首页 > 面试题库 >

30分钟后如何终止PHP会话?

宦源
2023-03-14
问题内容

我需要将会话保留30分钟,然后销毁它。


问题答案:

您应该自己实现会话超时。其他人提到的两个选项_session.gc_maxlifetime_和_session.cookie_lifetime_都不可靠。我将解释其原因。

第一:

session.gc_maxlifetime
session.gc_maxlifetime 指定秒数,此后将数据视为“垃圾”并清除。垃圾收集在会话开始期间发生。

但是,垃圾回收器仅以_session.gc_probability_除以_session.gc_divisor_的概率启动。使用这些选项的默认值(分别为1和100),机会只有1%。

好吧,您可以简单地调整这些值,以便更频繁地启动垃圾收集器。但是,当启动垃圾收集器时,它将检查每个已注册会话的有效性。这是高成本的。

此外,当使用PHP的默认_session.save_handler文件时,会话数据存储在_session.save_path_指定的路径中的文件中。使用该会话处理程序,会话数据的期限是根据文件的最后修改日期而不是最后访问日期计算的:

注意: 如果使用默认的基于文件的会话处理程序,则文件系统必须跟踪访问时间(atime)。Windows
FAT并非如此,如果您卡在FAT文件系统或任何其他无法进行时间跟踪的文件系统上,则您将不得不想出另一种方式来处理会话的垃圾回收。从PHP 4.2.3开始,它使用mtime(修改日期)代替atime。因此,对于没有时间跟踪功能的文件系统,您不会有任何问题。

因此,还可能会发生以下情况:删除会话数据文件,而由于会话数据最近未更新,因此会话本身仍被视为有效会话。

第二:

session.cookie_lifetime
session.cookie_lifetime 指定发送到浏览器的cookie的生存时间(以秒为单位)。[…]

恩,那就对了。这只会影响cookie的生存期,会话本身可能仍然有效。但是使会话无效是服务器的任务,而不是客户端。因此,这无济于事。实际上,将_session.cookie_lifetime_设置为0将会使会话的cookie成为真正的会话cookie,该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,以避免攻击会话,例如会话固定:

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过期,则还需要使用到期时间time()+60*30来保持会话cookie的活动。


 类似资料:
  • 我创建了一个自定义后台服务,它正在扩展IntentService。当我的应用程序进入后台时,我会调用这个类。startService()。Firsly onStartCommand在我返回START_STICKY的地方被调用(就像我读过一些其他帖子,以保持我的服务处于活动状态,并在由于内存不足而被终止时根据需要重新创建)。在那之后,我将实现onHandleIntent(intent)方法,从调用者

  • 我们使用作业 属性来自动清理已完成的作业。当我们的作业数量非常少(10-50 个)时,作业(及其 Pod)将在完成后大约 60 秒被清理。但是,现在我们的集群上运行了 ~5000 个作业,完成后需要 30 分钟才能清理 Job 对象。 这是一个问题,因为尽管作业就在那里,不消耗资源,但我们确实使用< code>ResourceQuota(选择器计数/jobs.batch)来控制我们的工作负载,并且

  • 本文向大家介绍c#学习之30分钟学会XAML,包括了c#学习之30分钟学会XAML的使用技巧和注意事项,需要的朋友参考一下 1.狂妄的WPF 相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API。例如:WinForm(带控件表单)、GDI+(2D图形)、DirectX API(3D图形)以及流媒体和流文档等,都需要不同的API来构建应用程序。 WPF就是看着上面的操作复杂和

  • 2面挂 题目: 1. 多线程:手写死锁 2. 手写SQL:公司是跨境电商,请设计三个表,统计每个品类的总销售额,就这些信息,自由发挥。 3. 项目问题:计算标签相似度使用了编辑距离算法,请问是如何考虑的,中国红和中国,国红,中红之间计算的相似度是多少。 总结:G! 1. 简单 2. 简历里面写了会写复杂sql,实际上很久没练习了,平常都是mybatis Plus 的分步写,已经忘记怎么写好sql了

  • 1、实习都干了什么啊? 2、实习遇到最大的困难是什么啊?是怎么解决的? 3、平常是怎么学习的啊? 4、docker、k8s都用过吗? 5、都用什么联调啊? 6、网络和多线程会吗? 全程唠嗑,你看我还有机会吗? #2022秋招##研发工程师#

  • 业务面第一次: 主要针对简历进行提问: 1.线程的创建方式? 2.集合都包括哪些数据结构? 3.AarryList和LinkedList的区别? 4.HashMap的put方法底层实现流程? 5.HashMap底层数据结构? 6.谈谈你对多态的理解? 7.Spring和SpringBoot的关系? 二者启动方式有和区别? 8.SpringBoot自动装配原理? 9.谈一谈你对Spring的AOP的