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

4

1 回答 1

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 似乎暗示检查错误报告级别并查看它是否等于 0 会告诉您错误是否应该被抑制。因此,理论上,您可以编辑 CodeIgniter 错误处理程序并添加一个if (error_reporting()) { /* show error */ }.

于 2012-08-31T16:42:22.130 回答