0

我正在尝试创建一个系统,当用户在 x 时间内处于非活动状态时,他们应该被注销并发送回“index.php”。我正在使用我在这里找到的代码 - http://cookbooks.adobe.com/post_Set_a_time_limit_on_a_login_session__PHP_-16701.html我把它放在这样的函数中:

phpfunc/inactivity.php

<?php

function inactivity() {
    // create a session 
    if (!isset($_SESSION)) {
        session_start();
    }

    // store the current time
    $now = time();

    // get the time the session should have expired
    $limit = $now - 60*20;

    // check the time of the last activity
    if (isset ($_SESSION['last_activity']) && $_SESSION['last_activity'] < $limit) {
        // if too old, clear the session array and redirect
        $_SESSION = array();
        header('../index.php');
        exit;
    } 
    else {
        // otherwise, set the value to the current time
        $_SESSION['last_activity'] = $now;
    }
}

?>

然后,我像这样调用函数......在我受保护页面的顶部

模板/login_success.php:

<?php
require('/Users/Eamon/Sites/phpfunc/inactivity.php');
inactivity();

if($_SESSION['username'] === null){
    header("location: ../index.php");
}
?>

<h1>Login Successful</h1>
<h2>Username: <? echo $_SESSION['username']?></h2>
<div id="logoutlinkdiv" >
    <a href = "#" >Log out</a>
</div>

我可以登录 - 所有不活动的东西似乎都有效。我在这里和那里添加了一些回显语句来测试它......登录后我尝试进入受保护的页面 - 就像这个“localhost/~Eamon/templates/login_success.php”它让我看到它......之后20分钟我必须重新登录。但是,我有一个页面,一旦用户注销(单击“logoutlinkdiv”链接后)就会加载 - 它上面有一个链接可以再次登录。当我单击此链接时,我收到消息“错误的用户名或密码” - 可以在以下文件中找到(登录时执行)。再过 20 分钟后,我可以再次登录而不会出现此错误。

检查登录.php

<?php

session_start();

$host="localhost"; // Host name
$username="root"; // Mysql username
$password="bonjour3"; // Mysql password
$db_name="itit"; // Database name
$tbl_name="members"; // Table name

// Connect to server and select databse.
$mysqli = new mysqli("$host", "$username", "$password", "$db_name")or die("cannot connect");

// Define $myusername and $mypassword
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

$sql = $mysqli->prepare("SELECT * FROM $tbl_name WHERE username=? and password=?");
$sql->bind_param('ss',$myusername,$mypassword);
$sql->execute();
$sql->store_result();//apply to prepare statement
$numRows = $sql->num_rows;

if($numRows === 1){
    $_SESSION['username'] = $myusername;
}
else {
    echo "Wrong Username or Password";
    session_destroy();
}
?>

这是前面提到的注销页面(用户可以再次登录......麻烦页面!):

模板/注销.php

<?php
session_start();
session_destroy();
?>

<div id="loginlinkdiv" >
    <h2>You have been logged out.</h2>
    <a href = "#">Log in</a>
</div>

如果它是相关的......这是我正在使用的jquery。我正在做一个 SPA - 所以 jquery 在 index.php 的“主” div 中为我加载和清空东西 - 这里:

索引.php

<?php session_start(); ?>

<!DOCTYPE html>
<html>
<head>
<title>it IT</title>
    <script src="reqscripts/jquery.js" type="text/javascript"></script>
    <script src="js/application.js" type="text/javascript"></script>
</head>
<body>
    <div id="main"></div>
</body>
</html>

更新

按照建议-我尝试了此页面上的第一个答案:

如何在 30 分钟后使 PHP 会话过期?

我更改了两个文件。

phpfunc/inactivity.php 现在看起来像这样:

<?php

function inactivity() {

    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
        // last request was more than 30 minutes ago
        session_unset();     // unset $_SESSION variable for the run-time 
        session_destroy();   // destroy session data in storage
        header("/Users/Eamon/Sites/index.php");
    }

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

?>

和 templates/login_success.php 看起来像这样:

<?php
require('/Users/Eamon/Sites/phpfunc/inactivity.php');
session_start();
inactivity();
?>

<h1>Login Successful</h1>
<h2>Username: <? echo $_SESSION['username']?></h2>
<div id="logoutlinkdiv" >
    <a href = "#" >Log out</a>
</div>

同样的问题似乎还在发生……我想我发现了一个新的小故障。当我单击登录链接 (templates/logout.php) 时,它会将我带到 index.php。我尝试登录,但文本框中的信息被重置,似乎什么也没发生。当我再次尝试时 - 我再次收到“错误的用户名或密码”。此外 -<? echo $_SESSION['username']?>不再出现在 login_success.php 页面上。

更新

好像我没有登录,因为<? echo $_SESSION['username']?>仍然没有输出任何东西。

4

1 回答 1

0

选项一:

使用 session.gc_maxlifetime

ini_set('session.cookie_lifetime',  600);
session_start();

http://php.net/manual/en/function.session-set-cookie-params.php

该值(默认为 1440 秒)定义未使用的 PHP 会话将保持活动状态的时间。例如:用户登录,浏览您的应用程序或网站,数小时,数天。没问题。只要他的点击之间的时间不超过1440秒。这是一个超时值。

选项二:

session.cookie_lifetime

这个值(默认为 0,这意味着直到浏览器下一次重新启动)定义会话 cookie 的存活时间(以秒为单位)。听起来类似于 session.gc_maxlifetime,但它是一种完全不同的方法。该值间接定义了会话的“绝对”最大生命周期,无论用户是否处于活动状态。如果此值设置为 60,则每个会话每分钟一小时后结束。

选项三:

session_start();
// set time-out period (in seconds)
$inactive = 600;

// check to see if $_SESSION["timeout"] is set
if (isset($_SESSION["timeout"])) {
    // calculate the session's "time to live"
    $sessionTTL = time() - $_SESSION["timeout"];

    if ($sessionTTL > $inactive) {
        session_destroy();
        header("Location: /logout.php");
    }
}

$_SESSION["timeout"] = time();
于 2013-06-18T14:39:04.487 回答