PHP会话超时

use*_*391 46 php session redirect timeout login

当用户登录时,我正在创建一个会话:

$_SESSION['id'] = $id;
Run Code Online (Sandbox Code Playgroud)

如何在X分钟的会话上指定超时,然后在达到X分钟后执行功能或页面重定向?

编辑:我忘了提到由于不活动我需要会话超时.

Jac*_*cco 85

首先,存储用户上次发出请求的时间

<?php
  $_SESSION['timeout'] = time();
?>
Run Code Online (Sandbox Code Playgroud)

在后续请求中,检查他们提前多久提出请求(本例中为10分钟)

<?php
  if ($_SESSION['timeout'] + 10 * 60 < time()) {
     // session timed out
  } else {
     // session ok
  }
?>
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果PHPINI中的默认会话超时比您选择的时间短,则会话可以在此之前超时.默认情况下,超时通常不到一小时.如果您不希望客户端控制超时,则需要将此代码与session.cookie_lifetime的ini_set组合.此答案也不处理客户删除其cookie的情况. (21认同)
  • PHP默认为'0',表示:"直到浏览器关闭".如果浏览器删除了cookie,那么首先不会设置`$ _SESSION ['timeout']`var.但是,我跳过会话管理的所有其他事情,因为这个问题仅询问超时. (2认同)

Vin*_*vic 44

当会话到期时,数据不再存在,所以类似于

if (!isset($_SESSION['id'])) {
    header("Location: destination.php");
    exit;
}
Run Code Online (Sandbox Code Playgroud)

只要会话不再有效,它就会重定向.

您可以使用session.cookie_lifetime设置会话cookie的有效时间

ini_set("session.cookie_lifetime","3600"); //an hour
Run Code Online (Sandbox Code Playgroud)

编辑:如果由于安全问题(而不是方便)计时会话,请使用接受的答案,如下面的评论所示,这是由客户控制的,因此不安全.我从未将此视为安全措施.

  • 会话cookie生命周期存在一些问题,最值得注意的是,它依赖于*client*来强制执行它.cookie的生命周期是允许客户端清理无用/过期的cookie,不要与任何安全相关的东西混淆. (11认同)

小智 5

首先检查会话是否尚未创建,如果没有创建会话.在这里我只设置1分钟.

<?php 
   if(!isset($_SESSION["timeout"])){
     $_SESSION['timeout'] = time();
   };
   $st = $_SESSION['timeout'] + 60; //session time is 1 minute
?>

<?php 
  if(time() < $st){
    echo 'Session will last 1 minute';
  }
?>
Run Code Online (Sandbox Code Playgroud)