Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
|
Есть SOAP сервер. Он может переодически умирать. На главной странице сайта выводится модуль напрямую зависящий от этого сервера, соответсвенно ситуация: когда сервер умирает, SoapClient выкидывает Warning и страница недоступна.
Для того что бы отлавливать этот момент написал следующий код:
PHP:
скопировать код в буфер обмена
public function init() { try { $this->thсApi = new MegaTourApi(); try { //пробуем получить данные от шлюза 'notAvailable' => false, 'citiesFrom' => $this->thсApi->getActualDepartureCities(), 'countryTo' => $this->thсApi->getAvailableCountries(), 'hotels' => $this->thсApi->getAvailableHotels(), 'nights' => $this->thсApi->getAvailableNights(), 'categories' => $this->thсApi->getAvailableCategories(), 'complex' => $this->thсApi->getAvailableComplex() ); } catch (SoapFault $e) { //Если произошла ошибка, или нет связи, то показываем заглушку - сайт не падает $this->data['notAvailable'] = true; } } catch (Exception $e) { //чтоб уж наверняка пытаемся словить общее исключение $this->data['notAvailable'] = true; } }
Но данный код работает не совсем корректно. Все дело в том что у меня отключено кеширование WSDL (не будем вдаваться в подробности почему), и собственно сайт падает именно при попыткен запроса WSDL файла.
Если файл уже закеширован, то все проблемы с соединением при вызове удаленных функций выкидывают исключения SoapFault и прекрасно отлавливаются в коде.
Собственно вот вопрос, как отлавливать ситуацию когда он пытается запросить WSDL файл и падает. При этом он не вызывает исключение, а вызывает ошибку уровня Warning.
Ошибки хендлятся в системе кастомной функцией (от Yii Framework), но наделять её способностью игнорировать эту ошибку я не хочу.
Хочется найти способ инкапсулировать все что касается общения с серверов в одном месте.
Гуглил на данную тему, и нашел способ лежащий на поверхности:
Проверять жив ли сервер до того как делать к нему запрос, для этого я написал следующий код:
PHP:
скопировать код в буфер обмена
public function __construct() { ini_set('default_socket_timeout', 5 ); $server_url = 'http://****/service/wsdl'; $errno = 0; $errstr = ''; parent ::__construct ($server_url, array('trace' => 1, 'connection_timeout' => 5, 'exceptions' => true)); } else { throw new SoapFault('server unavailable', "Can't connect to server $errno $errstr"); } }
Но как вы понимаете такой способ не работает, fsockopen даже при лежащем сервере возвращает true. Видимо я не доконца разобрался с fsockopen.
Стоит отметить что вариант "делать запрос и проверять какой заголовок пришел в ответе" совсем не канает, т.к. если сервер умирает, то умирает капитально. И никакого ответа мы не получим, и в добавок еще потратим кучу времени на ожидание ответа.
Системный вызов пинга тоже не сработает, т.к. сервер пингуется, а вот ВЕБ часть на нём умирает.
Вообещм подскажите оптимальный способ которым вы решали подобные проблемы(Отредактировано автором: 15 Августа, 2012 - 09:01:01)
|