2

我知道比忽略错误更好,我保证。运行XML-Sitemaps生成器会在没有有效会话信息的情况下击中URL,以取悦CodeIgniter。结果是每个抓取的页面都有一个E_NOTICE,并且有一个日志(和电子邮件通知)让我变得疯狂。没有什么能够打破,没有人或机器人受到伤害 - 只有我的理智受到影响。为什么@运营商不会在CodeIgniter中禁止E_NOTICE?

的几名技术人员已经设计了CodeIgniter的反序列化修复()失败:

我和每个前提,而仍运行获得数以百计的以下通知:

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消息,它会特别抑制吗?如果不是,那么这条线怎么可能产生所有这些让我想把我所有的头发都撕掉的通知?

回答

5

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

重要的是要记住的是,标准的PHP错误处理程序是完全绕过通过error_types除非回调指定的错误类型是非常重要的函数返回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 */ }

+0

真是一个辉煌的一天!感谢你使这个如此清晰 - 我终于能够在不到五分钟的时间内更新我的异常处理程序,并且我感到非常放心,并且受到更好的教育。干杯。 –