对于每个请求,您可以通过几种不同的方式来判断会话是否已经开始,例如:
$isSessionActive = (session_id() != "");
要么:
$isSessionActive = defined('SID');
但是,如果您启动会话然后将其关闭,它们都将失败。session_id()将返回前一个会话的ID,同时SID将对其进行定义。同样,如果您已经有一个活动会话,则此时调用session_start()将生成一个E_NOTICE。有没有一种明智的方法来检查会话当前是否处于活动状态,而不必诉诸输出缓冲,关闭运算符(@session_start())或其他类似hacky的方法?
session_id()
SID
session_start()
E_NOTICE
@session_start()
编辑8/29/2011:向PHP 5.4添加了新功能来解决此问题:“通过新功能session_status公开会话状态”
// as of 8/29/2011 $isSessionActive = (session_status() == PHP_SESSION_ACTIVE);
编辑12/5/11:PHP手册上的session_status()。
查看对原始问题的修改;基本上,PHP 5.4及更高版本现在具有session_status()解决此问题的功能!
session_status()
“通过新功能session_status公开会话状态”(SVN修订版315745)