当遇到错误时,Cowardly PHP脚本就会退出

时间:2011-02-02 02:13:22

标签: 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_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...

    }

现在的问题是,如果网页返回类似404的错误,则该脚本将被终止。例如,如果找不到mysterysite.com,则脚本不会尝试使用yahoo.com。它只是退出那个以及之后的所有链接。

我希望它退出尝试抓取错误链接并转到queque中的下一个链接。我尝试将“退出”更改为“继续”,但没有运气。它仍然停止。我做错了什么或者这是否特定于使用cURL?

3 个答案:

答案 0 :(得分:2)

您应该按照指示将exit更改为continue

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

将它放在脚本的顶部

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

另外,您在哪里使用$to_be_spidered的网址?另一件事(也是相关的),你的循环使用foreach

会更好看
foreach ($to_be_spidered as $target_url) {

答案 1 :(得分:2)

exit()终止当前脚本...所以,如果那不是您正在寻找的行为,请不要使用它。

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

答案 2 :(得分:2)

以前的两条建议都有效。但是我发现代码中还有另一个潜在的错误。

来自http://php.net/manual/en/function.curl-exec.php

  

“如果是CURLOPT_RETURNTRANSFER选项   设置后,它将返回结果   成功,失败就错了。“

因此,如果 curl_exec 返回的数据等于空字符串或零(或http://php.net/manual/en/language.types.boolean.php中确定为FALSE的任何其他内容),则此脚本将错误地将其视为错误。

因此,您需要确保检查类型。以下应该有效:

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

我还建议在try catch循环中包装每个CURL请求。