// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);
// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);
session_start(); // ready to go!
这是通过配置服务器使会话数据保持至少一个小时的不活动状态,并指示您的客户端在相同的时间跨度之后应该“忘记”会话 ID 来实现的。要达到预期的结果,这两个步骤都是必需的。
如果你不告诉客户在一个小时后忘记他们的会话 ID (或者如果客户是恶意的,选择忽略你的指令) ,他们将继续使用相同的会话 ID,其有效持续时间将是不确定的。这是因为服务器端生存期已过的会话不会立即进行垃圾回收,而只会进行 每当会话 GC 启动时回收。
GC 是一个潜在的昂贵的过程,所以通常概率是相当小的,甚至为零(一个网站获得大量的点击率可能会完全放弃概率 GC,并安排它发生在后台每隔 X 分钟)。在这两种情况下(假设客户端不合作) ,有效会话生存期的下限都是 session.gc_maxlifetime,但是上限是不可预测的。
如果你没有将 session.gc_maxlifetime设置为相同的时间跨度,那么服务器可能会在此之前丢弃空闲的会话数据; 在这种情况下,仍然记得会话 ID 的客户端将显示它,但是服务器将找不到与该会话相关的数据,有效地表现为会话刚刚开始。
session_start(); // ready to go!
$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
// this session has worn out its welcome; kill it and start a brand new one
session_unset();
session_destroy();
session_start();
}
// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;
会话 ID 持久性
到目前为止,我们一点也不关心每个会话 id 的确切值,只关心数据应该在我们需要的时间内存在的要求。请注意,在会话 ID 对您很重要的情况下(不太可能) ,必须注意在需要时使用 session_regenerate_id重新生成它们。
if(time() - $_SESSION['login_time'] >= 1800){
session_destroy(); // destroy session.
header("Location: logout.php");
die(); // See https://thedailywtf.com/articles/WellIntentioned-Destruction
//redirect if the page is inactive for 30 minutes
}
else {
$_SESSION['login_time'] = time();
// update 'login_time' to the last time a page containing this code was accessed.
}