我们已经
session_gcmaxlife=5
在 php.ini 中设置,但服务器上的会话变量在 5 秒后没有被破坏
我们希望在 PHP 中将会话的最大生命周期设置为 5 秒。
一般来说,您可以说 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();
}
您可以使用 setcookie() 函数。它需要一个超时参数。
$timeout = 5; // 5 seconds
if (isset($_COOKIE[session_name()])){
setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, "/");
}
然后你可以在 Firefox 中使用 cookie manager+ 来查看会话是否被破坏。
好的 - 对我来说,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;
}
}
包括 $_SESSION 变量的时间戳属性。定期检查并根据条件使会话过期:
$_SESSION['mytimestamp'] = time();