【问题标题】:How to set maximum life of the session to be 5 sec in PHP如何在 PHP 中将会话的最大生命周期设置为 5 秒
【发布时间】:2012-05-07 07:14:31
【问题描述】:

我们设置了 session_gcmaxlife=5 在 php.ini 中,但服务器上的会话变量在 5 秒后不会被销毁

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

【问题讨论】:

  • 你可能想看看这个stackoverflow.com/questions/520237/…
  • php.net/manual/en/session.configuration.php - session.gc_maxlifetime 指定数据将被视为“垃圾”并可能清理的秒数
  • 对于您需要的会话,几乎无法使用?
  • @Ibrahim Azhar Armar .... 我们正在使用该解决方案,但如果有人关闭浏览器,我们将无法运行该超时代码。所以我们需要服务器上的东西。
  • @srini 时间可以改变,只需要逻辑。

标签: php session


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    那么你可以使用 Firefox 中的 cookie manager+ 以查看会话是否被破坏。

    source

    【讨论】:

    • 重写会话cookie实际上是个坏主意...它可能会导致我之前发现的问题。
    • 我已经使用了这个解决方案并且工作得非常好。 @CD001 你遇到了什么问题?
    【解决方案3】:

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

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

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

    引用:How long will my session last?

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

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

    现在你只需要一个 if 语句来检查 5 秒何时过去,当它过去时,销毁会话数据。

    if (time() - $_SESSION['created'] > 5) {
        session_destroy();
        session_unset();
    }
    

    【讨论】:

    • +1 和我说的差不多(几乎同时),但更漂亮 ;)
    • 我们正在使用该解决方案,但如果有人关闭浏览器,我们将无法运行该超时代码。所以我们需要服务器上的东西。
    • 嗯 - 是 在服务器上;如果他们关闭浏览器,那么会话无论如何都会被破坏 - 假设您在 session_set_cookie_params() 中将 cookie 生命周期设置为 0 - 因为关闭浏览器时 cookie 将被删除。唯一的附带条件是确保 session.use_trans_sid = "0" 以便通过会话的 URI 不会复活它。
    【解决方案4】:

    好的 - 对我来说,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-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2017-06-23
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多