[英]How to tell if a session is active?
根据请求,您可以通过几种不同的方式判断会话是否已启动,例如:
$isSessionActive = (session_id() != "");
要么:
$isSessionActive = defined('SID');
但是,如果你开始一个会话,然后关闭它们,它们都会失败; session_id()
将返回先前会话的ID,同时将定义SID
。 同样,如果您已经激活会话,此时调用session_start()
将生成E_NOTICE
。 是否有一种理智的方法来检查会话当前是否处于活动状态,而不必求助于输出缓冲,关闭运算符( @session_start()
)或其他类似hacky的东西?
编辑:我写了一个补丁试图让这个功能包含在PHP中: http : //bugs.php.net/bug.php?id = 52982
编辑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公开会话状态”(SVN修订版315745)
如果您在PHP 5.4之前的版本中需要此功能,请参阅hakre的答案 。
我通过在各种会话创建/关闭/销毁功能周围添加几个包装函数来解决这个问题。 基本上:
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']);
}
哈希,但完成了我所需要的。
我也遇到了这个问题, $_SESSION
的设置对我来说不是一个选项。 对于PHP 5.3.8:
define('SID')
将返回FALSE
,并且未设置$_SESSION
。 session_id()
来设置会话ID,这都是独立的。 session_start()
,定义了SID
并将$_SESSION
设置为空数组。 session_destroy()
取消设置session_id()
,然后它是一个空字符串。 SID
将保持定义(并设置为之前的值,可能是空字符串)。 $_SESSION
保持不变。 它将在下次调用session_start
重置/填充。 对于这些状态,尤其是可以在两者之间调用session_id()
来设置下一个会话的id,因此无法使用SID
, $_SESSION
和session_id()
安全地确定会话状态。
使用session_start()
(例如使用@
)“尝试”可能不太有用,因为这会改变会话状态并更改$_SESSION
的内容(如果cookie不是请求的一部分,则添加set-cookie标头) 。 这不适合我的情况。
当我运行测试时,我遇到了这样的行为,即当会话处于活动状态时,您无法尝试更改session.serialize_handler
的ini设置,即使您将其设置为相同的值也是如此。 session.use_trans_sid
文档也是如此,它更轻量级。 这引出了以下功能:
/**
* @return bool
*/
function session_is_active()
{
$setting = 'session.use_trans_sid';
$current = ini_get($setting);
if (FALSE === $current)
{
throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting));
}
$result = @ini_set($setting, $current);
return $result !== $current;
}
据我所知,错误是仅检查活动会话状态(未禁用),因此在禁用会话时不应返回误报。
要使此功能与PHP 5.2兼容,需要稍加修改:
/**
* @return bool
*/
function session_is_active()
{
$setting = 'session.use_trans_sid';
$current = ini_get($setting);
if (FALSE === $current)
{
throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting));
}
$testate = "mix$current$current";
$old = @ini_set($setting, $testate);
$peek = @ini_set($setting, $current);
$result = $peek === $current || $peek === FALSE;
return $result;
}
一些沙盒 。
以下代码仅为我转储一个session_id(),而不是两个
session_start();
echo session_id();
session_destroy();
echo session_id();
如果你仍然遇到困难,你可以尝试创建一个变量来检查,当你销毁会话时你会破坏它。
session_start();
$_SESSION['intialized'] = 'This will not print';
$_SESSION = array(); // Unset all variables
session_destroy();
echo $_SESSION['initialized']; // No output
这是一个很好的替代品,当你转到5.4时不会破坏东西:
if(!function_exists('session_status')){
function session_active(){
return defined('SID');
}
}else{
function session_active(){
return (session_status() == PHP_SESSION_ACTIVE);
}
}
您需要检查多个位置以验证会话是否处于活动状态:
1- cookie存在且未过期2-基础会话存储机制(文件系统或数据库)具有与cookie匹配的记录。
Ken,如果会话被销毁,$ _SESSION数组应该不可用......或者至少,你的值应该是未设置的。 因此,理论上(未经测试)您应该能够检查数组中的值以了解当前是否设置了任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.