-1

我们已经 session_gcmaxlife=5 在 php.ini 中设置,但服务器上的会话变量在 5 秒后没有被破坏

我们希望在 PHP 中将会话的最大生命周期设置为 5 秒。

4

4 回答 4

4

一般来说,您可以说 session.gc_maxlifetime 指定自上次更改会话数据以来的最大生命周期(不是上次调用 session_start !)。但是 PHP 的会话处理有点复杂。

因为会话数据由仅由 session_start 调用的垃圾收集器删除,其中 session.gc_probability 的概率除以 session.gc_divisor。默认值为 1 和 100,因此垃圾收集器仅在所有 session_start 调用的 1% 中启动。这意味着即使会话在理论上已经超时(会话数据的更改时间超过 session.gc_maxlifetime 秒前),会话数据的使用时间也可以更长。

因此,我建议您实现自己的会话超时机制。请参阅我对如何在 30 分钟后使 PHP 会话过期?更多细节。

Quote:我的会话将持续多长时间?

最好的解决方案是实现自己的超时机制。这很简单。

$_SESSION['created'] = time();

现在,您只需要一个 if 语句来检查 5 秒是否已过,并在此时间销毁会话数据。

if (time() - $_SESSION['created'] > 5) {
    session_destroy();
    session_unset();
}
于 2012-04-26T14:46:38.780 回答
1

您可以使用 setcookie() 函数。它需要一个超时参数。

$timeout = 5; // 5 seconds 
if (isset($_COOKIE[session_name()])){
    setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, "/");
}

然后你可以在 Firefox 中使用 cookie manager+ 来查看会话是否被破坏。

资源

于 2012-04-26T14:29:31.473 回答
1

好的 - 对我来说,5 秒的会话听起来毫无意义(因为会话应该在无状态应用程序中维护应用程序状态......是的)。

您最好的选择可能是time()在会话中保存一个到期时间戳(+ 5 秒),例如$_SESSION['expires']- 然后每当您开始会话时,检查该变量是否存在,如果存在(并且在过去),则终止会话关闭并重新开始。


[编辑]

这是另一种可能有效的可能性但您需要创建一个对象来管理您的会话 - 然后您可以拥有一个kill()可以在会话过期时调用的方法,并且在该__destruct()方法中 - 它不是完全证明的,因为析构函数会仅在对象被销毁时调用 - 但它应该可以工作。

class Session {

  private static $_instance;

  //private constructor to prevent external instantiation
  private function __construct($sSessName, $sSavePath, $iGCLifetime, $sCookieDomain, $sCookiePath) {

    //session parameters
    ini_set("session.save_path", $sSavePath);
    ini_set("session.gc_maxlifetime", $iGCLifetime);
    ini_set("session.use_trans_sid", false);

    //session cookie parameters
    ini_set("session.use_cookies", true);
    ini_set("session.use_only_cookies", true);
    ini_set("session.cookie_domain", $sCookieDomain);
    ini_set("session.cookie_path", $sCookiePath);
    ini_set("session.cookie_lifetime", 0);

    //set the session name
    session_name($sSessName);

    //set the session cookie paramaters
    session_set_cookie_params(0, $sCookiePath, $sCookieDomain);

    //start the session
    session_start();

    //check to see if the session has expired - and if so kill it
    if(isset($_SESSION['expires']) && time() > $_SESSION['expires']) {
      $this->kill();
    }

    //if not - set the expiry time in the session
    else {
      $_SESSION['expires'] = time() + 5;
    }
  }

  //destructor function _should_ kill the $_SESSION when the object is destroyed
  public function __destruct() {
    $this->kill();
  }

  //session killer
  public function kill() {
    //kill the session cookie
    setcookie(session_name(), null, time()-3600);

    //kill the session
    session_unset();
    session_destroy();
  }

  //Singleton instance getter
  public function getInstance() {
    if(!self::$_instance) self::$_instance = new self();
    return self::$_instance;
  }
}
于 2012-04-26T14:48:43.647 回答
-1

包括 $_SESSION 变量的时间戳属性。定期检查并根据条件使会话过期:

$_SESSION['mytimestamp'] = time();
于 2012-04-26T14:26:00.467 回答