2010-06-18 226 views
44

当用户登录时一样,所以我创建一个会话:PHP会话超时

$_SESSION['id'] = $id; 

我怎么能在X分钟即会话指定超时,然后把它执行功能或页面重定向一次它已经达到了X分钟?

编辑:我忘了提及,我需要会议超时由于不活动。

+9

的可能重复[我怎样在30分钟后到期PHP的会话?](http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-分钟) – Kzqai 2012-03-06 19:12:46

回答

86

第一,存储用户最后一次在随后的请求提出的要求

<?php 
    $_SESSION['timeout'] = time(); 
?> 

,检查多久前,他们做了他们以前的请求(在这个例子中10分钟)

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

但是,如果您的PHPINI中的默认会话超时时间短于您的时间选择。 默认情况下,超时通常少于一个小时。 如果您不希望客户端控制超时,则需要将此代码与session.cookie_lifetime的ini_set组合起来。 此答案也不处理客户端删除其Cookie的情况。 – Olhovsky 2012-07-27 11:32:27

+2

PHP默认为'0',意思是:“在浏览器关闭之前”。如果浏览器删除了这个cookie,'$ _SESSION ['timeout']'var就不会被设置在第一位。但是,我忽略了所有其他的会话管理,因为这个问题只会询问超时。 – Jacco 2012-09-08 09:50:24

42

当会话过期数据不再存在,所以像

每当会话不再活性
if (!isset($_SESSION['id'])) { 
    header("Location: destination.php"); 
    exit; 
} 

将重定向。

您可以设置会话cookie是多久活着使用session.cookie_lifetime

ini_set("session.cookie_lifetime","3600"); //an hour 

编辑:如果您由于安全问题(而不是方便,)使用接受的答案,如下面的评论定时会话了显示,这是由客户端控制,因此不安全。我从来没有想到这是一个安全措施。

+1

你必须删除$ _SESSION ['id']周围的引号 – 2010-06-18 10:18:16

+0

即使你没有投票答案,你的解决方案似乎更安全,我的问题是,你是否必须在每个页面上设置会话超时?我想这是有道理的,因为你会希望它每次重新启动?其次,你是否必须为每个页面执行session_start来获取会话数据,或者只需要一次就可以启动它?谢谢 – nagates 2011-06-28 07:25:51

+10

会话cookie生命周期中存在一些问题,最值得注意的是,它依赖*客户端*来执行它。 Cookie的使用期限是为了让客户清理无用的/过期的cookies,它不会与任何与安全相关的问题混淆。 – Jacco 2011-07-08 12:01:04

0
session_cache_expire(20); 
    session_start(); // NEVER FORGET TO START THE SESSION!!! 
    $inactive = 1200; //20 minutes *60 
    if(isset($_SESSION['start'])) { 
$session_life = time() - $_SESSION['start']; 
if($session_life > $inactive){ 
    header("Location: user_logout.php"); 
} 
    } 
    $_SESSION['start'] = time(); 

    if($_SESSION['valid_user'] != true){ 
    header('Location: ../....php'); 
    }else{ 

来源:http://www.daniweb.com/web-development/php/threads/124500

+1

只是谷歌搜索你遇到的第一个答案,并将其粘贴到堆栈溢出不利于本网站的重点。此外,session_cache_expire()与会话的长度无关,因此您粘贴的答案有不正确的信息。 – 2013-04-23 15:37:46

+0

@DavidBradbury默认情况下,cookie存储session_id,如果cookie过期,则session_id无法在客户端请求时访问。 – 2016-12-27 05:44:17

5

只是先检查会议是不是阿雷dy创建,如果不创建一个。在这里我只设置它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'; 
    } 
?> 
2
<script type="text/javascript"> 
window.setTimeout("location=('timeout_session.htm');",900000); 
</script> 

在每一页的页眉中现场测试已经为我工作(该网站是尚未制作)。它所属的HTML页面结束会话,并只是通知用户需要重新登录。这似乎比使用PHP逻辑更简单。 我很想谈谈这个想法。任何陷阱我没有看到它?

+4

并非所有人都使用js – chuckieDub 2013-06-04 19:29:22

+0

如果您使用同一站点打开了多个选项卡,则必须全部刷新才能创建一个活动,否则如果您继续在1个选项卡中工作,其他人将在超时后显示“timeout_session.htm”。非常令人沮丧,特别是如果“timeout_session.htm”未设置/销毁会话。 =) – 2016-09-08 19:00:44

1
<?php 
session_start(); 

if (time()<$_SESSION['time']+10){ 
$_SESSION['time'] = time(); 
echo "welcome old user"; 
} 

else{ 
session_destroy(); 
session_start(); 
$_SESSION['time'] = time(); 
echo "welcome new user"; 
} 
?> 
0
<?php 
session_start(); 
if($_SESSION['login'] != 'ok') 
    header('location: /dashboard.php?login=0'); 

if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) { 
    // session inactive more than 10 min 
    header('location: /logout.php?timeout=1'); 
} 

$_SESSION['last-activity'] = time(); // update last activity time stamp 

if(time() - $_SESSION['created'] > 600) { 
    // session started more than 10 min ago 
    session_regenerate_id(true); // change session id and invalidate old session 
    $_SESSION['created'] = time(); // update creation time 
} 
?> 
+0

确保评论你的答案,并解释你在哪里以及如何添加超时。 – Rias 2015-04-21 21:20:19

1

Byterbit溶液是问题的,因为:

  1. 具有服务器端的cookie的客户端控制期满是一个安全问题。
  2. 如果服务器端设置的过期超时小于客户端设置的超时,页面将不会反映cookie的实际状态。
  3. 即使为了开发阶段的舒适性,这也是一个问题,因为它不会在发布阶段反映正确的行为(在时间上)。

用于cookie,通过session.cookie_lifetime设置过期是设计智能和安全智能的正确解决方案!为了使会话过期,你可以使用session.gc_maxlifetime。

到期调用session_destroy,因为他们可能已经过期,可能会产生不可预知的结果饼干。

使php.ini中的变化也是一个有效的解决方案,但它使全球有效期为这可能不是你真正想要的整个领域 - 某些页面可能选择保留一些饼干比别人多。