当我使用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();
}
如果您使用的是自动加载器,它可能无法加载保存在会话中的类。