以下函数接收表示URL的字符串参数,然后将URL加载到simple_html_dom对象中。如果加载失败,它将尝试再次加载该URL。
public function getSimpleHtmlDomLoaded($url)
{
$ret = false;
$count = 1;
$max_attemps = 10;
while ($ret === false) {
$html = new simple_html_dom();
$ret = $html->load_file($url);
if ($ret === false) {
echo "Error loading url: $url\n";
sleep(5);
$count++;
$html->clear();
unset($html);
if ($count > $max_attemps)
return false;
}
}
return $html;
}
但是,如果url加载一次失败,则它对于当前url仍然失败,并且在
max attemps
完成之后,它也将在下一次调用该函数以及其余必须处理的url时继续失败。如果URL暂时处于脱机状态,则保持失败是有道理的,但是它们不是(我在运行脚本时检查过)。
任何想法为什么这不能正常工作?
我还要指出的是,当开始加载网址失败时,它仅给出警告(而不是多个),并显示以下消息:
PHP Warning: file_get_contents(http://www.foo.com/resource): failed to open stream: HTTP request failed! in simple_html_dom.php on line 1081
这行代码提示:
$ret = $html->load_file($url);
最佳答案
我已经测试了您的代码,并且对我来说效果很好,每次我调用该函数时,它都会从第一次返回有效结果。
因此,即使您从同一域加载页面,页面或服务器上也可能会有一些保护。
例如,page可以查找一些cookie,或者服务器可以查找您的用户代理,并且如果它将您视为漫游器,则它不会提供正确的内容。
解析某些网站时,我遇到了类似的问题。
对我来说,答案是查看某些页面/服务器期望什么,并使我的代码进行模拟。从伪造用户代理到生成Cookie等各种内容。
顺便说一句,您是否尝试过创建一个简单的php脚本,只是为了测试“简单的html dom”解析器是否可以在您的服务器上正常运行?那是我要检查的第一件事。
最后,我必须在一种情况下添加该代码,尽管我多次尝试解析一页都失败了,但我无法赢得蒙版游戏。最后,我制作了一个脚本,该脚本在linux命令行文本浏览器lynx中加载该页面,并将整个页面保存在本地,然后我解析了运行良好的本地文件。
关于php - 失败时尝试再次加载URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12616334/