如何在PHP中设置会话超时时间
PHP会话在30分钟内过期的简单方法。
注意:如果您想更改时间,只需将30更改为所需的时间,不要更改* 60:这将给出分钟数。
按分钟计算:(30 * 60)
按天数计算:(n * 24 * 60 * 60)n = 天数
Login.php
HomePage.php
Click Here to Login"; } else { $now = time(); // Checking the time now when home page starts. if ($now > $_SESSION['expire']) { session_destroy(); echo "Your session has expired! Login here"; } else { //Starting this else one [else1] ?> Welcome Log out"; ?>
LogOut.php
你应该自己实现会话超时。其他人提到的两个选项(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文件系统或任何其他不支持atime跟踪的文件系统,则必须找到另一种处理会话垃圾收集的方法。自从PHP 4.2.3以来,它使用mtime(修改日期)而不是atime。因此,您将不会遇到无法跟踪atime的文件系统的问题。
因此,会话数据文件可能在仍被认为是有效的会话时被删除,因为会话数据最近未更新。
其次:
session.cookie_lifetime
session.cookie_lifetime指定发送到浏览器的Cookie的生存时间(以秒为单位)。[...]
是的,没错。这仅影响Cookie寿命,会话本身仍然可能是有效的。但使会话.cookie_lifetime设置为0
将使会话的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分钟,你还需要使用带有
time()+60*30
到期时间的setcookie
来保持会话cookie处于活动状态。