会话对象销毁失败


Why Session object destruction failed

当我使用session_destroy()时,我得到"Session object destruction failed"

session_start();
if(isset($_SESSION['user_id'])){    
    $_SESSION=array();
    if(isset($_COOKIE[session_name()])){
        setcookie(session_name(),'',0,"/");
    }
    session_destroy();
}

是什么导致这个错误?

错误:

警告:session_destroy(): Session object destruction failed

这是相当琐碎的,没有会话已经启动对象已经提交,所以你不能销毁它

@操作符并不总是处于活动状态,例如具有错误报告功能。

编辑:

1)是什么导致了这个错误?

这个错误通常是当PHP试图删除会话文件,但它找不到它。

session_destroy的情况下,PHP中只有一个地方会导致这种情况。这就是当session.save_handler(参见session_set_save_handler)为销毁动作返回FALSE的时候。这取决于您使用哪种类型的保存处理程序,默认的是files。对于那个,当session.save_path设置错误时(例如,不是可访问的目录),这将导致这样的错误。

2)为什么"@"不能抑制错误?

这取决于如何创建输出和PHP配置。@并不总是有效。例如,在set_error_handler上注册的回调函数仍然会收到这些消息。

在我的情况下,我试图在cookie创建之前销毁会话。换句话说,我做了如下操作:

session_start();
...
session_destroy();

所以服务器在破坏会话之前没有机会与浏览器"接触"。对我来说很简单的解决方案是

session_start();
...
$_SESSION=array();

使用以下代码:

if(session_status() === PHP_SESSION_ACTIVE) {
    session_unset();
    session_destroy();
}

如果您使用的是自动加载器,它可能无法加载保存在会话中的类。