Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проверить доступность SOAP сервера

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: И подловить момент недоступности
TheKIP
Отправлено: 14 Августа, 2012 - 18:03:17
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Есть SOAP сервер. Он может переодически умирать. На главной странице сайта выводится модуль напрямую зависящий от этого сервера, соответсвенно ситуация: когда сервер умирает, SoapClient выкидывает Warning и страница недоступна.

Для того что бы отлавливать этот момент написал следующий код:

PHP:
скопировать код в буфер обмена
  1.  
  2.     public function init() {
  3.         try {
  4.             $this->thсApi = new MegaTourApi();
  5.             try {
  6.                 //пробуем получить данные от шлюза
  7.                 $this->data = array(
  8.                     'notAvailable' => false,
  9.                     'citiesFrom' => $this->thсApi->getActualDepartureCities(),
  10.                     'countryTo' => $this->thсApi->getAvailableCountries(),
  11.                     'hotels' => $this->thсApi->getAvailableHotels(),
  12.                     'nights' => $this->thсApi->getAvailableNights(),
  13.                     'categories' => $this->thсApi->getAvailableCategories(),
  14.                     'complex' => $this->thсApi->getAvailableComplex()
  15.                 );
  16.             } catch (SoapFault $e) {
  17.                 //Если произошла ошибка, или нет связи, то показываем заглушку - сайт не падает
  18.                 $this->data['notAvailable'] = true;
  19.             }
  20.            
  21.         } catch (Exception $e) {
  22. //чтоб уж наверняка пытаемся словить общее исключение
  23.            $this->data['notAvailable'] = true;
  24.         }
  25.     }
  26.  


Но данный код работает не совсем корректно. Все дело в том что у меня отключено кеширование WSDL (не будем вдаваться в подробности почему), и собственно сайт падает именно при попыткен запроса WSDL файла.

Если файл уже закеширован, то все проблемы с соединением при вызове удаленных функций выкидывают исключения SoapFault и прекрасно отлавливаются в коде.

Собственно вот вопрос, как отлавливать ситуацию когда он пытается запросить WSDL файл и падает. При этом он не вызывает исключение, а вызывает ошибку уровня Warning.

Ошибки хендлятся в системе кастомной функцией (от Yii Framework), но наделять её способностью игнорировать эту ошибку я не хочу.

Хочется найти способ инкапсулировать все что касается общения с серверов в одном месте.

Гуглил на данную тему, и нашел способ лежащий на поверхности:
Проверять жив ли сервер до того как делать к нему запрос, для этого я написал следующий код:

PHP:
скопировать код в буфер обмена
  1.  
  2.  public function __construct() {
  3.         ini_set('default_socket_timeout', 5);
  4.  
  5.         $server_url = 'http://****/service/wsdl';
  6.  
  7.         $errno = 0;
  8.         $errstr = '';
  9.  
  10.         if ($fs = fsockopen(parse_url($server_url, PHP_URL_HOST), 80, $errno, $errstr, 5)) {
  11.             parent::__construct($server_url, array('trace' => 1, 'connection_timeout' => 5, 'exceptions' => true));
  12.          } else {
  13.             throw new SoapFault('server unavailable', "Can't connect to server $errno $errstr");
  14.          }
  15.     }
  16.  


Но как вы понимаете такой способ не работает, fsockopen даже при лежащем сервере возвращает true. Видимо я не доконца разобрался с fsockopen.

Стоит отметить что вариант "делать запрос и проверять какой заголовок пришел в ответе" совсем не канает, т.к. если сервер умирает, то умирает капитально. И никакого ответа мы не получим, и в добавок еще потратим кучу времени на ожидание ответа.

Системный вызов пинга тоже не сработает, т.к. сервер пингуется, а вот ВЕБ часть на нём умирает.

Вообещм подскажите оптимальный способ которым вы решали подобные проблемы

(Отредактировано автором: 15 Августа, 2012 - 09:01:01)

 
 Top
DlTA
Отправлено: 14 Августа, 2012 - 20:09:09
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




странно что от варнингов падает страница, ничего не перепутали?
 
 Top
TheKIP
Отправлено: 15 Августа, 2012 - 08:52:20
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Нет не перепутал. Собсно это поведение фреймворка Yii. У него зарегестрирован собственный обработчик ошибок, который получает все ошибки и выводит собственную страницу отчета.

И он что на алерты её выодит, что на варнинги, что на ексепшены.

Суть то не в этом, даже если бы страница не падала а выдавалось просто предпруждение вверху страницы на продакшене это не допустимо. (вариант скрыть ошибки и забить не принимается, так как ошибки нужно решать, а не скрывать).
 
 Top
DlTA
Отправлено: 15 Августа, 2012 - 09:09:23
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




от общих глаз ее надо скрыть, а уже потом логировать, а у вас получается что либо выводить либо падать
 
 Top
TheKIP
Отправлено: 15 Августа, 2012 - 12:41:26
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Она и так скрыта. Просто в момент когда сервер лежит страница дооооолго не может открыться. Потому как опция connection_timeout' => 5 влияет только на общение с сервером а не получение WSDL.

В итоге не важно видит ли пользователь ошибку, или нет - сайт не доступен. Т.к. идет очень долгое "ожидание ответа" В конце которого он безмолвно заканчиваетс пустой страницей (если error_reporting = 0) или красивой страницей заглушкой, о том что сайт временно недоступен (запрограмированное нами поведение в случаях ошибки)

Вопрос в том КАК ПРОВЕРИТЬ перед этим?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB