Php 尝试在URL失败时再次加载URL
下面的函数接收表示url的字符串参数,然后将url加载到简单的\u html\u dom对象中。如果加载失败,它将尝试再次加载urlPhp 尝试在URL失败时再次加载URL,php,url,error-handling,simple-html-dom,Php,Url,Error Handling,Simple Html Dom,下面的函数接收表示url的字符串参数,然后将url加载到简单的\u html\u dom对象中。如果加载失败,它将尝试再次加载url public function getSimpleHtmlDomLoaded($url) { $ret = false; $count = 1; $max_attemps = 10; while ($ret === false) { $html = new simple_html_dom(); $re
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 attems
结束后,该函数的下一次调用以及它必须处理的其余url也将继续失败
如果URL暂时脱机,则继续失败是有意义的,但它们不是(我在脚本运行时检查过)
你知道为什么这不能正常工作吗
我还想指出,当开始加载URL失败时,它只会发出警告(而不是多个警告),并显示以下消息:
PHP警告:文件\u获取\u内容(http://www.foo.com/resource):失败
打开流:HTTP请求失败!在simple_html_dom.php中联机
1081
这是由这行代码提示的:
$ret = $html->load_file($url);
我已经测试了您的代码,它对我来说非常适合,每次我调用该函数时,它都会从第一次调用时返回有效的结果 因此,即使您从同一域加载页面,页面或服务器上也会有一些保护。 例如,页面可以查找一些cookie,或者服务器可以查找您的用户代理,如果它将您视为机器人,则不会提供正确的内容 我在解析一些网站时遇到了类似的问题。 对我来说,答案是看看某个页面/服务器期望什么,并让我的代码模拟它。一切,从伪造用户代理到生成cookies等等 顺便问一下,您是否尝试创建一个简单的php脚本来测试“SimpleHTMLDOM”解析器是否可以在您的服务器上运行而不会出错?这是我要检查的第一件事
最后,我必须补充一点,在一个案例中,我多次尝试解析一个页面都失败了,我无法赢得屏蔽游戏。最后,我编写了一个脚本,在linux命令行文本浏览器lynx中加载该页面,并将整个页面保存在本地,然后我解析了该本地文件,该文件工作正常 这可能是函数本身的问题 问题是,函数error\u get\u last()也会返回所有私有错误,不知道,这可能取决于PHP版本 我通过将其更改为(检查错误是否更改,而不是是否为null)解决了问题 (或使用非对象函数:file\u get\u html()):
您是否从同一域获取url?也许抓取服务器有一些保护?它们都是从同一个域抓取的,但是如果它有某种保护,那么它不会也无法从浏览器加载URL吗?另外,如果我重新启动脚本,它将再次正常工作。
function load_file()
{
$preerror=error_get_last();
$args = func_get_args();
$this->load(call_user_func_array('file_get_contents', $args), true);
// Throw an error if we can't properly load the dom.
if (($error=error_get_last())!==$preerror) {
$this->clear();
return false;
}
}