Трусливый PHP-скрипт просто завершает работу при возникновении ошибки - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть функция 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. Это просто выходит из этого и все ссылки после.

Я бы хотел, чтобы он прекратил попытки найти ссылку на ошибку и перейти к следующей ссылке в очереди. Я попытался изменить «выход» на «продолжить», но безуспешно. Это все еще останавливается. Я делаю что-то не так или это специфично для использования cURL?

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

exit() завершает текущий скрипт ... так что не используйте его, если это не то поведение, которое вы ищете.

if (!$html) {
    echo "<br />cURL error number:" .curl_errno($ch);
    echo "<br />cURL error:" . curl_error($ch);
} else {
    // etc. etc...
}
2 голосов
/ 02 февраля 2011

Два предыдущих предложения будут работать.Однако я заметил еще одну потенциальную ошибку в коде.

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

"Если установлена ​​опция CURLOPT_RETURNTRANSFER, она вернет результат в случае успеха, FALSE в случае ошибки."

Так что, если curl_exec возвращает данные, которые равны пустой строке или нулю (или что-либо еще, определенное как FALSE в http://php.net/manual/en/language.types.boolean.php),, этот сценарий неправильно прочитает его как ошибку.

Так что вам нужно убедиться, что вы проверили тип. Следующее должно работать:

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

Также я рекомендую также обернуть каждый запрос CURL в цикл try catch.

2 голосов
/ 02 февраля 2011

Вы должны изменить exit на continue, как указано.

Получаете ли вы какие-либо ошибки?Включено ли сообщение об ошибках?Неустранимая ошибка остановит выполнение.

Поместите это в верхнюю часть вашего скрипта

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

Кроме того, где вы используете URL из $to_be_spidered?Еще одна вещь (также связанная), ваш цикл выглядел бы намного лучше, используя foreach

foreach ($to_be_spidered as $target_url) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...