2012-02-03 94 views
12

我已经在PHP中创建了一个项目,我正在管理会话。如果用户不活动15分钟,如何过期php会话

我正在通过编写以下代码行在我的config.php文件中创建会话。

session_start(); 

并销毁此会话,在logout.php文件中我写了下面一行。

session_destroy(); 

,我还没有提到在任何其他项目文件会议的任何代码,但问题是会议是积极的,直到我打电话logout.php,

我要的是,如果用户会话应该过期无效15分钟。

谁能帮助我,这我是新来的PHP,请给一些示例代码或链接来实现这个..

+1

http://bytes.com/topic/php/answers/686406-php-session-time-limit – tekknolagi 2012-02-03 06:28:56

+0

也http://stackoverflow.com/questions/520237/how-do-i-expire -a-php-session-after-30-minutes – tekknolagi 2012-02-03 06:29:52

+0

also http://stackoverflow.com/questions/3002975/set-expire-time-for-a-session – tekknolagi 2012-02-03 06:30:18

回答

15

可以拨打下面的功能在你的头文件,这样,每当用户确实当时页面的任何活动被刷新,并检查是否会话超时与否。

function auto_logout($field) 
{ 
    $t = time(); 
    $t0 = $_SESSION[$field]; 
    $diff = $t - $t0; 
    if ($diff > 1500 || !isset($t0)) 
    {   
     return true; 
    } 
    else 
    { 
     $_SESSION[$field] = time(); 
    } 
} 

使用类似这样的标题

if(auto_logout("user_time")) 
    { 
     session_unset(); 
     session_destroy(); 
     location("login.php");   
     exit; 
    }  

User_time是会话名称。我希望这个答案能帮助你。该代码的实际作用是:“检查diff是否大于1500秒,如果没有,则设置新的会话时间。”您可以根据您的要求更改时差(1500)。

+0

只是一个问题kamal,我如何创建一个名为'user_time'的会话,因为我以前只是写'session_start()' – mack 2012-02-03 07:04:34

+0

你需要编写$ _SESSION ['name']; – Kamal 2012-02-03 07:12:25

+0

感谢卡迈勒,它为我工作 – mack 2012-02-03 07:23:12

1

您可以使用类似这样

# Session Logout after in activity 
function sessionX(){ 
    $logLength = 1800; # time in seconds :: 1800 = 30 minutes 
    $ctime = strtotime("now"); # Create a time from a string 
    # If no session time is created, create one 
    if(!isset($_SESSION['sessionX'])){ 
     # create session time 
     $_SESSION['sessionX'] = $ctime; 
    }else{ 
     # Check if they have exceded the time limit of inactivity 
     if(((strtotime("now") - $_SESSION['sessionX']) > $logLength) && isLogged()){ 
      # If exceded the time, log the user out 
      logOut(); 
      # Redirect to login page to log back in 
      header("Location: /login.php"); 
      exit; 
     }else{ 
      # If they have not exceded the time limit of inactivity, keep them logged in 
      $_SESSION['sessionX'] = $ctime; 
     } 
    } 
} 

但要记住功能sessionX ()必须出现在session_start()之后

查看详情here

+0

如果我写这个代码在我的'config.php'文件只有,这将工作的整个项目,因为我的'config.php'包含在所有其他项目文件? – mack 2012-02-03 06:35:52

+0

我想它使用cookies – mack 2012-02-03 06:44:22

4

尝试

ini_set('session.gc_maxlifetime',54000); 
    ini_set('session.gc_probability',1); 
    ini_set('session.gc_divisor',1); 

使用在此之前调用在session_start()

+0

如果我在我的'config.php'文件中写入这3行'session_start()'它会为我的整个项目工作吗?作为'config.php'包含在所有其他项目文件中 – mack 2012-02-03 06:38:40

+0

是的这适用于你包含config.php – user1186779 2012-02-03 06:40:55

+0

的每个项目,以下是我的'config.php'中的代码,看看它会工作吗? '?<?php ini_set('session.gc_maxlifetime',54000); ini_set('session.gc_probability',1); ini_set('session.gc_divisor',1); session_start(); $ link = mysql_connect('localhost','root'); mysql_select_db('dbname',$ link)或死(“不能连接到数据库”); ?>' – mack 2012-02-03 06:43:12

1

我知道这是一个回答的问题,但我只是想分享我的经验,因为我觉得这是一个更简单的方法。我不确定这是否是最好的方式,但这里。我所做的是:

  1. 我设置PHP会话($ _SESSION [“超时”])到当前时间(时间()),当用户在

  2. 记录写下了以下功能验证用户是否处于活动状态。

功能sessionTimeOut(){

//这个函数是加入900秒(15分钟,这是您希望用户//被惰性自动注销的时间量),以之前注册的用户上次活动时间。//然后,检查当前时间是否大于您希望用户//保持登录状态而不超时(即15分钟)的时间。如果更大,那么您将被重定向到//登录页面,您可以在URL上使用http://www.yourwebpage/login.php?status=timeout发起注销功能。

如果($ _SESSION [ '超时'] + 900>时间()){

// User Active so reset time session. 
    $_SESSION['timeout'] = time(); 

}否则{

// session timed out then redirect to login page 
    header('Location:http://'. $_SERVER[HTTP_HOST] . '/login.php?status=timeout'); 

}

}

最后:调用sessionTimeOut();函数在检查用户是否登录后在头文件中。这允许每当用户刷新或导航到新页面时调用该函数。因此,它完美地工作(至少在我的情况下),实现我的目的,所以我想我只是分享给你们。

-1

这是继续Kamal发布。我想同样的代码,但使其通过如下修改它的工作吧:

/* code */ 
function fnlogout($field) 
{ 
    $t = time(); 
    if (!isset($_SESSION[$field])) 
     $_SESSION[$field] = time(); 
    $t0 = $_SESSION[$field]; 
    $diff = $t - $t0; 
    if ($diff > 60) 
    {   
     return true; 
    }enter code here 
    else 
    { 
     return false; 
    } 
} 
function fnheader() 
{ 
    if(fnlogout("user_time")) 
    { 
     session_unset(); 
     session_destroy(); 
     header("location:index.php?action=expired"); 
     exit; 
    } 
} 

是,卡迈勒是正确的关于代码插入的位置。一部分作为函数,另一部分作为每个文件的头文件或公共头函数。

2

time()存储在$time变量中。创建名为$setTime的变量并设置您希望用户超时的时间。

之后检查条件,如果$_SESSION['setTime']为空或未设置,则将超时值存储到会话中,否则当页面刷新时将新值分配给$_SESSION['setTime']

$time = time(); 
    $setTime = time() + 60; 
    if (empty ($_SESSION ['setTime']) || !isset ($_SESSION ['setTime'])) { 
     $_SESSION ['setTime'] = $setTime; 
    } 

之后,检查当前时间是否大于等于存储时间。如果它没有设置会话。也会破坏会话。

if (time() >= (int) $_SESSION ['setTime']) { 
    session_unset(); 
    session_destroy(); 
} 
相关问题