gpt4 book ai didi

php - 为什么此错误处理函数会导致domdocument()挂起?

转载 作者:行者123 更新时间:2023-12-03 08:04:41 29 4
gpt4 key购买 nike

我包括此简单的错误处理功能来格式化错误:

date_default_timezone_set('America/New_York');

// Create the error handler.
function my_error_handler ($e_number, $e_message, $e_file, $e_line, $e_vars) {

// Build the error message.
$message = "An error occurred in script '$e_file' on line $e_line: \n<br />$e_message\n<br />";

// Add the date and time.
$message .= "Date/Time: " . date('n-j-Y H:i:s') . "\n<br />";

// Append $e_vars to the $message.
$message .= "<pre>" . print_r ($e_vars, 1) . "</pre>\n<br />";

echo '<div id="Error">' . $message . '</div><br />';

} // End of my_error_handler() definition.

// Use my error handler.
set_error_handler ('my_error_handler');

当我将其包含在以下脚本中时
$dom = new DOMDocument();
$dom->loadHTML($output);
$xpath = new DOMXPath($dom);

并解析一个网页(在这种情况下为 http://www.ssense.com/women/designers/all/all/page_1,我确实有权解析),我得到如下错误:
AN ERROR OCCURRED IN SCRIPT '/HSPHERE/LOCAL/HOME/SITE.COM/SCRIPT.PHP' ON LINE 59: 
DOMDOCUMENT::LOADHTML(): HTMLPARSEENTITYREF: NO NAME IN ENTITY, LINE: 57


AN ERROR OCCURRED IN SCRIPT '/HSPHERE/LOCAL/HOME/SITE.COM/SCRIPT.PHP' ON LINE 59: 
DOMDOCUMENT::LOADHTML(): TAG NAV INVALID IN ENTITY, LINE: 58

错误很多,页面永远无法完成加载。但是,如果我不包含此错误处理程序,则该行
$dom->loadHTML($output);

不会引发任何错误,并且我会在几秒钟内得到预期的结果。我假设错误处理程序正在捕获与loadHTML()有关的警告,否则未报告这些警告。 (即使我使用
@$dom->loadHTML($output);

仍然会报告错误。)如何修改错误处理程序以适应对loadHTML()的调用,否则将解决此问题?

最佳答案

导致错误的原因不是自定义错误处理程序。

我在没有自定义错误处理程序的情况下运行了以下代码:

$output = file_get_contents("http://www.ssense.com/women/designers/all/all/page_1");
$dom = new DOMDocument();
$dom->loadHTML($output);
$xpath = new DOMXPath($dom);

当我运行它时,我收到大量警告消息,类似于您的错误处理程序中的警告消息。

我认为您看到的问题只是您的错误处理程序正在报告错误,而PHP默认情况下未报告该错误。

默认情况下,错误报告的级别由 php.ini设置确定,但是可以使用 error_reporting()函数来覆盖。设置自己的错误处理程序时,必须自己确定要处理的报告级别。您的错误处理程序将在每个错误和通知时被调用,因此您将输出所有内容的错误消息,除非您针对当前 error_reporting()级别显式检查正在生成的错误。

请记住,使用 @错误抑制运算符只是为该行设置 error_reporting(0)的简写。例如,这一行:
@$dom->loadHTML($output);

是以下内容的简写形式:
$errorLevel = error_reporting(0);
$dom->loadHTML($output);
error_reporting($errorLevel);

由于使用自定义处理程序时正常的PHP错误报告将被完全绕开,因此使用 @运算符是没有意义的,因为当前 error_reporting()级别已被完全忽略。您必须将自定义代码写入错误处理程序,以检查当前的 error_reporting()级别并进行相应的处理,例如:
function my_error_handler() {
if (error_reporting() == 0) {
return; // do nothing when error_reporting is disabled.
}

// normal error handling here
}

我的假设是,当不使用自定义错误处理程序时,PHP只是默认设置为 error_reporting()级别,该级别低于产生的错误。

如果在代码的顶部添加 error_reporting(E_ALL | E_STRICT);,即使没有启用自定义错误处理程序,也会看到这些相同的错误。

关于php - 为什么此错误处理函数会导致domdocument()挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129115/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com