Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > [fsockopen] Отлов ошибки fgets


Автор: diam 24.1.2007, 10:50
Здравствуйте.

Пишу скрипт, получающий информацию со страницы и работающий через прокси. При этом есть один ньюанс: прокси стоит в той же сети, что и сервер, с которого запускается скрипт, и в этой же сети стоит dns. Отсюда возможны три ошибки, которые мне нужно отлавливать:
1. Невозможно достучаться до прокси.
2. Не работает интернет.
3. Изменились параметры страницы.
Ошибка номер 2 возникает в том случае, когда интернет не работает, но dns способен получить IP-адрес www.example.com (из кэша берёт).

Проблема заключается в том, что не могу отловить состояние 2, php просто тупо дохнет, выкидывая сообщение:
Цитата

Maximum execution time of 60 seconds exceeded

При этом try..catch не помогает, что, в принципе, для php естественно.

Вот код.
Код

$fp = fsockopen($config['proxy_ip'], $config['proxy_port'], $errno, $errstr, 120);
if (!$fp) {
    // 1. Прокси недоступен.
    throw new Loader_OrderListProxyException('Прокси недоступен: ' . $errstr);
}
$q = ""
    . "GET http://www.example.com HTTP/1.0\r\n"
    . "Accept: */*\r\n"
    . "Accept-Language: ru\r\n"
    . "Accept-Charset: windows-1251\r\n"
    . "UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"
    . "Authorization: {$config['auth']}\r\n"
    . "\r\n";
if (!fwrite($fp, $q))
    throw new Loader_OrderListProxyException('Прокси недоступен');

try {
    $answer = "";
    while (!feof($fp))
        // 2. Прокси доступен, но нет интернета.
        //    НО! Эту ошибку НЕ ОТЛОВИТЬ! Отлов исключений не
        //    помогает, php просто тупо дохнет!
        $answer .= fgets($fp, 128);
    fclose($fp);
} catch (Exception $e) {
    throw new Loader_OrderListInetException('Интернет недоступен');
}

if (!$answer || strpos(substr($answer, 0, 100), 'HTTP/1.0 200 OK') === false) {
    // 3. Изменились параметры страницы, адрес страницы, etc.
    throw new Loader_OrderListDataException('Изменились параметры страницы');
}


ХОтя в документации php про fgets написано:
Цитата

Returns a string of up to length - 1 bytes read from the file pointed to by handle. Reading ends when length - 1 bytes have been read, on a newline (which is included in the return value), or on EOF (whichever comes first). If no length is specified, it will keep reading from the stream until it reaches the end of the line.

If an error occurs, returns FALSE.


Есть мысли, как отлавливать эту ошибку? Тупой вылет скрипта меня не устраивает.

С уважением.

Автор: Glip 24.1.2007, 11:25
например так
Код

    function error2Exception($code, $string, $file, $line, $context)
    {
        throw new BaseException($string, $code);
    }

    class BaseException extends Exception
    {
        public function __toString()
        {
            return
                "[$this->message] in: \n".
                $this->getTrace();
        }
    }

    error_reporting(E_ALL | E_STRICT);
    set_error_handler('error2Exception', E_ALL | E_STRICT);



и лови

Автор: diam 24.1.2007, 11:26
Вопрос можно ставить так: как отлавливать фатальные ошибки в php?

Через set_error_handler можно установить свой обработчик ошибок, откуда можно генерировать исключения.

Тема закрыта, всем спасибо за помощь.

Автор: Glip 24.1.2007, 11:28
http://www.onphp.org/doxy/spl/classException.html

Автор: diam 24.1.2007, 11:34
Glip, не заметил твоего ответа, спасибо smile

Автор: Mal Hack 24.1.2007, 15:55
Цитата(diam @  24.1.2007,  10:50 Найти цитируемый пост)
Отсюда возможны три ошибки, которые мне нужно отлавливать:

Надо HEAD запрос слать.


Автор: diam 25.1.2007, 09:04
Цитата(Mal Hack @  24.1.2007,  18:55 Найти цитируемый пост)
Надо HEAD запрос слать.

А можно подробнее?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)