当遇到错误时,怯懦的PHP脚本就会退出

当遇到错误时,怯懦的PHP脚本就会退出,php,curl,Php,Curl,我有一个cURL函数,它可以抓取数组中指定的所有网页。数组被称为$to_be__spidered,函数的执行方式如下: $to_be_spidered = array('http://google.com', 'http://mysterysite.com', 'http://yahoo.com'); for ($i = 0; $i != count($to_be_spidered); $i++) { $ch = curl_init(); curl_setop

我有一个cURL函数,它可以抓取数组中指定的所有网页。数组被称为$to_be__spidered,函数的执行方式如下:

$to_be_spidered = array('http://google.com', 'http://mysterysite.com', 'http://yahoo.com');

for ($i = 0; $i != count($to_be_spidered); $i++) {

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
        curl_setopt($ch, CURLOPT_URL,$target_url);
        curl_setopt($ch, CURLOPT_FAILONERROR, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_AUTOREFERER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 0); // set cURL timeout
        $html= curl_exec($ch);

        // error handling
        if (!$html) {
                echo "<br />cURL error number:" .curl_errno($ch);
                echo "<br />cURL error:" . curl_error($ch);
                exit;
        }

// etc. etc...

    }
$to\u be\u spidered=数组('http://google.com', 'http://mysterysite.com', 'http://yahoo.com');
对于($i=0;$i!=count($to\u be\u spidered);$i++){
$ch=curl_init();
curl_setopt($ch,CURLOPT_USERAGENT,$USERAGENT);
curl_setopt($ch,CURLOPT_URL,$target_URL);
curl_setopt($ch,CURLOPT_FAILONERROR,true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_AUTOREFERER,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_TIMEOUT,0);//设置curl TIMEOUT
$html=curl\u exec($ch);
//错误处理
如果(!$html){
echo“
卷曲错误号:”.cURL\u errno($ch); echo“
卷曲错误:“.cURL\u错误($ch); 出口 } //等等等等。。。 }
现在的问题是,如果网页返回404之类的错误,脚本将被终止。例如,如果未找到mysterysite.com,则脚本不会尝试爬虫yahoo.com。它只是退出了那个和所有的链接之后


我希望它停止尝试爬行错误链接,并转到queque中的下一个链接。我试着将“退出”改为“继续”,但没有成功。它仍然停止。我是否做错了什么,或者这是由于使用cURL造成的?

您应该将
exit
更改为
continue
,如图所示

您是否收到任何错误?是否启用了错误报告?致命错误将停止执行

把这个放在脚本的顶部

ini_set('display_errors', 'On');
error_reporting(E_ALL);

另外,您在哪里使用来自
$to\u be\u spidered
的URL?另一件事(也是相关的),使用
foreach

foreach ($to_be_spidered as $target_url) {
exit()
终止当前脚本。。。所以,如果这不是你想要的行为,就不要使用它

if (!$html) {
    echo "<br />cURL error number:" .curl_errno($ch);
    echo "<br />cURL error:" . curl_error($ch);
} else {
    // etc. etc...
}
if(!$html){
echo“
卷曲错误号:”.cURL\u errno($ch); echo“
卷曲错误:“.cURL\u错误($ch); }否则{ //等等等等。。。 }
前面的两个建议将起作用。然而,我注意到代码中还有一个潜在的bug

“如果CULLOPT_返回传输选项 设置时,它将在 成功就是失败。”

因此,如果curl\u exec返回的数据等于空字符串或零(或在中确定为FALSE的任何其他内容),此脚本将错误地将其读取为错误

因此,您需要确保检查类型。以下方面应起作用:

if( $html===FALSE ) {
    // Report error
} else {
    // deal with content
}

此外,我还建议将每个卷发请求包装在一个try-catch循环中。

如果你是胆小鬼的鼓动者,我相信这就是退出使其退出:P@Trufa他已经指示将
退出
更改为
继续
,没有任何更改,因此这不是根本原因issue@Phil哇!以前有吗???我的坏(特别是)如果它是@Trufa没有编辑(到目前为止)。鸡蛋,碰面;-)@菲尔:我正在对着屏幕狂吠。:)+1使用
==
运算符检查期望值总是很好的。我不认为cURL抛出异常,并且怀疑任何成功的结果都可能被评估为
false
,这并没有解决根本的问题,因为OP已经指出尝试
继续
。我猜可能是从坏的“for循环”条件到从未实际使用
$to\u be\u spidered[$i]