在php中设置会话生存期


set up session lifetime in php

如何设置php会话变量在一小时后销毁?我在网上搜索,但我发现了非常不同的意见,他们都没有帮助。非常感谢。

比如说我有两个变量

$_SESSION["loged"];
$_SESSION["user"];

我希望他们在浏览器关闭两个小时后仍然在那里。

您可以设置一个会话变量来保存创建会话的时间:

在本例中,会话在10秒后销毁:

<?php
session_start();
if (!$_SESSION['created_at']) {
    $_SESSION['created_at']=time();
}
$age=time()-$_SESSION['created_at'];
if ($age>10) {
    session_destroy();
}
echo $age;
?>

如果您想控制特定会话变量的生存期,则需要进行自己的超时检查。最好的方法是向库中添加一个函数,在该函数中可以指定特定变量的有效期。这会将这两条信息放入会话中的一个数组中。然后,在常见的包含代码中,对该数组和unset()所有过期的会话变量进行循环。确保会话本身可以持续到您想要使用的最高值。

PHP会话本身并没有硬性的终身价值。它们有一个使会话过期的垃圾收集器。设置session.gc_maxlifetime是垃圾收集器将删除会话的最长期限。请注意,此最长使用期限是指上次访问而非创建它的时间。

但是,还有session.gc_probabilitysession.gc_divisor,它们一起告诉PHP运行垃圾收集器的频率。正常设置意味着每100个会话启动中就有1个会运行垃圾收集器。但这意味着,如果您的站点容量非常低,垃圾收集器可能无法运行数小时。这样做的明显效果是,会话的持续时间似乎远远超过了session.gc_maxlifetime设置。

有些用户可能想使用ini中的设置来修改即

ini_set('session.gc_maxlifetime') 

但这是错误的做法!您将修改整个PHP部署的配置。这是不切实际和危险的,不应该用于这样一个简单的案例。更不用说,大多数共享托管计划都会禁用ini_set,因为这些更改会影响系统上的每个用户。

相反,这里有一些用于手动处理会话过期的样板代码。

//最初

   session_start();
    $date = new DateTime();
    $ts = $date->getTimestamp();
    if($ts - $_SESSION["timestamp"]) > 60*60) {
    session_destroy();
    //log out!}
    else{
    $_SESSION["timestamp"] = $ts;
    }