如何判断会话是否处于活动状态?

2022-08-30 11:12:12

对于每个请求,您可以通过几种不同的方式判断会话是否已启动,例如:

$isSessionActive = (session_id() != "");

艺术

$isSessionActive = defined('SID');

但是,如果您启动会话,然后将其关闭,则这两者都会失败。 将返回上一个会话的 ID,而将定义。同样,此时调用将生成一个会话(如果已处于活动状态)。有没有一种合理的方法来检查会话当前是否处于活动状态,而不必诉诸输出缓冲,闭嘴运算符()或其他同样黑客化的东西?session_id()SIDsession_start()E_NOTICE@session_start()

编辑:我写了一个补丁来尝试将此功能包含在PHP中:http://bugs.php.net/bug.php?id=52982

EDIT 8/29/2011: PHP 5.4 中添加了新功能来修复此问题:“通过新功能公开会话状态,session_status”

// as of 8/29/2011
$isSessionActive = (session_status() == PHP_SESSION_ACTIVE);

编辑 12/5/11: session_status() 在 PHP 手册上。


答案 1

查看对原始问题的编辑;基本上,PHP 5.4及更高版本现在有一个名为session_status()的函数来解决这个问题!

“通过新功能session_status公开会话状态”(SVN 修订版 315745)

如果您在 PHP 5.4 之前的版本中需要此功能,请参阅 hakre 的答案


答案 2

我通过围绕各种会话创建/关闭/销毁函数添加几个包装器函数来解决这个问题。基本上:

function open_session() {
     session_start();
     $_SESSION['is_open'] = TRUE;
}

function close_session() {
   session_write_close();
   $_SESSION['is_open'] = FALSE;
}

function destroy_session() {
   session_destroy();
   $_SESSION['is_open'] = FALSE;
}

function session_is_open() {
   return($_SESSION['is_open']);
}

哈克,但完成了我需要的。


推荐