Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [fsockopen] Отлов ошибки fgets, исключения не помогают 
V
    Опции темы
diam
Дата 24.1.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 16



Здравствуйте.

Пишу скрипт, получающий информацию со страницы и работающий через прокси. При этом есть один ньюанс: прокси стоит в той же сети, что и сервер, с которого запускается скрипт, и в этой же сети стоит 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.


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

С уважением.

Это сообщение отредактировал(а) diam - 24.1.2007, 11:13
PM MAIL   Вверх
Glip
Дата 24.1.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 2
Всего: 18



например так
Код

    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);



и лови


--------------------
user posted image
PM MAIL   Вверх
diam
Дата 24.1.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 16



Вопрос можно ставить так: как отлавливать фатальные ошибки в php?

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

Тема закрыта, всем спасибо за помощь.
PM MAIL   Вверх
Glip
Дата 24.1.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 2
Всего: 18





--------------------
user posted image
PM MAIL   Вверх
diam
Дата 24.1.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 16



Glip, не заметил твоего ответа, спасибо smile
PM MAIL   Вверх
Mal Hack
Дата 24.1.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 5
Всего: 261



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

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


PM ICQ   Вверх
diam
Дата 25.1.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 16



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

А можно подробнее?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.