PHP.SU

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

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

> Найдено сообщений: 6
TheKIP Отправлено: 15 Августа, 2012 - 12:41:26 • Тема: Проверить доступность SOAP сервера • Форум: Работа с сетью

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

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

Вопрос в том КАК ПРОВЕРИТЬ перед этим?
TheKIP Отправлено: 15 Августа, 2012 - 08:52:20 • Тема: Проверить доступность SOAP сервера • Форум: Работа с сетью

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

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

Суть то не в этом, даже если бы страница не падала а выдавалось просто предпруждение вверху страницы на продакшене это не допустимо. (вариант скрыть ошибки и забить не принимается, так как ошибки нужно решать, а не скрывать).
TheKIP Отправлено: 14 Августа, 2012 - 18:03:17 • Тема: Проверить доступность SOAP сервера • Форум: Работа с сетью

Ответов: 4
Просмотров: 4457
Есть 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.

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

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

Вообещм подскажите оптимальный способ которым вы решали подобные проблемы
TheKIP Отправлено: 12 Октября, 2011 - 10:48:45 • Тема: Рекурсивная функция, определить уровень вложенности • Форум: Вопросы новичков

Ответов: 0
Просмотров: 150
Есть рекурсивная функция, которая строит меню из базы. В базе все свалено в одну таблицу, где наследование родитель-потомок осуществляется по столбцам parent и id

Функция просто проходит по все пунктам и составляет многомерный массив. Но мне понадобилось что бы он еще и строил правильные ссылки, с вложенностью. В базе они находятся только со своим кейвордом (выборка идет по нему).

PHP:
скопировать код в буфер обмена
  1.  
  2.         function getBrothers($id, $uri, $path="", $level=0, $items=array())
  3.         {
  4.                 $qGetItem = "SELECT name, keyword, id FROM ".$this->db->dbprefix('content')." where visible=1 and parent=?";
  5.                 $res = $this->db->query($qGetItem, array($id));
  6.                 $out = $res->result_array();
  7.        
  8.                 if (count($out) == 0) {
  9.                          return false;
  10.                 }
  11.                 else {
  12.                
  13.                         foreach ($out as $index => $row)
  14.                         {
  15.                         $path = $path."/".$row['keyword'];
  16.                         $out[$index]['link'] = $path; //составляем, правильный, сегментированный uri
  17.                        
  18.                         if (in_array($row['keyword'], $uri)) $out[$index]['act'] = true; else $out[$index]['act'] = false;   //делаем подсветку активных пунктов в меню
  19.                        
  20.                         $out[$index]['childs'] = $this->getBrothers($row['id'], $uri, $path, $level, $items)) //детишки
  21.        
  22.                         }
  23.                 }
  24.                 return $out;
  25.         }
  26.  


Вот строке 16, где комментарий "составляем правильный регламентированный ури" и есть интересующая меня часть кода.
Я хочу чтоб из тех кейвордов что берутся из базы состовлялось что то вроде level/sublevel1/sublevel2/ и т.д. где каждый сегмент это keyword отдельного пункта.

Они должны наращиваться по мере углубления вовнутрь. Но при моей реализации они наращиваются не только в глуб, но и в ширь, т.е. добавляются кейворды братьев, т.е. при каждом запуске рекурсии...

Вот я никак не могу додуматься как сделать так, что бы функция понимала что она сейчас находится на одном уровне, и добавляла сегменты только при переходе к следующему вложенному сегменту.

Я уже пытался сделать путем ввода счетчика, (в параметрах функции осталась переменная level), но счетчик так же увеличивается при каждом запуске рекурсии, и как ограничить область видимости я так и не додумался.
TheKIP Отправлено: 20 Апреля, 2011 - 22:27:01 • Тема: Работа с FTP • Форум: Программирование на PHP

Ответов: 4
Просмотров: 1472
А ведь и вправду помогло )

Блин, ведь знал что это из-за какой ни будь мелочи...

Спасибо!
TheKIP Отправлено: 20 Апреля, 2011 - 21:17:49 • Тема: Работа с FTP • Форум: Программирование на PHP

Ответов: 4
Просмотров: 1472
Warning: ftp_put() [function.ftp-put0]: bind() failed: Operation not permitted (1) in /home/y/yugavtoru/cadillac/publi c_html/admin/tradein/cont_add_it em.php on line 14

Есть скрипт который копирует файлы из своего локального каталога, в удаленную папку на ФТП. И после создания, при тестировании он работал.
Затем нам необоходимо было портировать его на другой ресурс, который находится на другом хостинге и вот никак не могу попбороть данную проблему.

Я использую банально функцию ftp_put, уже напрямую передаю ей значения "откуда" и " куда" (и conn_id ) все равно получаю эту ошибку.

Уже пробовал более изощренным методом, подключиться к ФТП, дойти до нужной папки ftp_chdir и попытаться загрузить - безрезультатно.

Разумеется CHMOD выставлен верно (777) и я даже пробовал выставлять его средствами php. Выставляется...но файл так и не копируется.

То же самое относится и к функции ftp_rawlist (она у меня служит для определения наличия файла в папке)

Может я чего то непонимаю? Я новичек в php и может чего то не улавливаю?
Подскажите пожалуйста...

Кусок листинга:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function connect_ftp () {
  3.   $host = "";
  4.   $user = "";
  5.   $pass = "";
  6.   $connect = ftp_connect($host); //подключаемся
  7.   if(!$connect)
  8.                 {log_write ("Ошибка соединения c FTP");}
  9.         else { log_write ("Подключились к FTP");}
  10.  
  11.   if ( ftp_login($connect, $user, $pass)) log_write ("Успешная авторизация на FTP"); else log_write ("Ошибка авторизации на FTP"); //логинимся
  12.  
  13.   return $connect;
  14.   }
  15.  
  16. $conn_id = connect_ftp ();
  17. ftp_put($conn_id, "/public_html/files/image/tradein/gm/BMW.JPG", $_SERVER["DOCUMENT_ROOT"].$big_pic_path."BMW.JPG", FTP_BINARY);
  18.  
  19.  

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB