为什么@运算符不会抑制CodeIgniter中的E_NOTICE?

时间:2012-08-31 16:37:00

标签: php codeigniter error-handling deserialization codeigniter-2

我知道,最好不要忽视错误。运行XML-Sitemaps生成器会在没有有效会话信息的情况下点击URL以取悦CodeIgniter。结果是每个被抓取的页面都有一个E_NOTICE,以及​​一个让我疯狂的日志(和电子邮件通知)。什么都没有破坏,没有人或机器人受到伤害 - 只有我的理智受到影响。

有些人为CodeIgniter设计了修复程序unserialize()失败:

我在每个前提下运行,仍然会收到以下数百条通知:

NOTICE: unserialize() [<a href='function.unserialize'>function.unserialize</a>]: Error at offset 98 of 128 bytes

这让我回到原点,一个非常简单的问题。这是CI的Session.php中有问题的第724行:

$data = @unserialize(strip_slashes($data));

我没有添加抑制性'@' - 它已经存在了。这是不是意味着它会在抛出时特别抑制E_NOTICE消息?如果没有,那么这条线怎么可能产生所有这些让我想要撕掉我所有头发的通知呢?

1 个答案:

答案 0 :(得分:5)

设置自定义错误处理程序会绕过PHP的错误处理 - 显然是PHP的错误抑制:

  

重要的是要记住,对于error_types指定的错误类型,标准PHP错误处理程序是完全被绕过的,除非回调函数返回FALSE。 error_reporting()设置将不起作用,无论如何都将调用您的错误处理程序 - 但是您仍然可以读取error_reporting的当前值并采取适当的操作。特别值得注意的是,如果导致错误的语句由@ error-control运算符预先添加,则此值将为0。

<?php
set_error_handler(function ($errno, $errstr) {
    echo $errstr;
}, E_ALL);
@unserialize("foo"); // Still shows $errstr!

这将取代PHP,可能会忽略您的错误抑制设置。有可能CodeIgniter正在使用自己的错误处理程序(我相信它有)并且无论错误抑制级别如何都会出错。

但是,PHP似乎暗示检查错误报告级别并查看它是否等于零将告诉您错误是否应该被抑制。因此,理论上,您可以编辑CodeIgniter错误处理程序并添加if (error_reporting()) { /* show error */ }