Она и так скрыта. Просто в момент когда сервер лежит страница дооооолго не может открыться. Потому как опция connection_timeout' => 5 влияет только на общение с сервером а не получение WSDL.
В итоге не важно видит ли пользователь ошибку, или нет - сайт не доступен. Т.к. идет очень долгое "ожидание ответа" В конце которого он безмолвно заканчиваетс пустой страницей (если error_reporting = 0) или красивой страницей заглушкой, о том что сайт временно недоступен (запрограмированное нами поведение в случаях ошибки)
Нет не перепутал. Собсно это поведение фреймворка Yii. У него зарегестрирован собственный обработчик ошибок, который получает все ошибки и выводит собственную страницу отчета.
И он что на алерты её выодит, что на варнинги, что на ексепшены.
Суть то не в этом, даже если бы страница не падала а выдавалось просто предпруждение вверху страницы на продакшене это не допустимо. (вариант скрыть ошибки и забить не принимается, так как ошибки нужно решать, а не скрывать).
Есть SOAP сервер. Он может переодически умирать. На главной странице сайта выводится модуль напрямую зависящий от этого сервера, соответсвенно ситуация: когда сервер умирает, SoapClient выкидывает Warning и страница недоступна.
Для того что бы отлавливать этот момент написал следующий код:
//Если произошла ошибка, или нет связи, то показываем заглушку - сайт не падает
$this->data['notAvailable']=true;
}
} catch (Exception $e){
//чтоб уж наверняка пытаемся словить общее исключение
$this->data['notAvailable']=true;
}
}
Но данный код работает не совсем корректно. Все дело в том что у меня отключено кеширование WSDL (не будем вдаваться в подробности почему), и собственно сайт падает именно при попыткен запроса WSDL файла.
Если файл уже закеширован, то все проблемы с соединением при вызове удаленных функций выкидывают исключения SoapFault и прекрасно отлавливаются в коде.
Собственно вот вопрос, как отлавливать ситуацию когда он пытается запросить WSDL файл и падает. При этом он не вызывает исключение, а вызывает ошибку уровня Warning.
Ошибки хендлятся в системе кастомной функцией (от Yii Framework), но наделять её способностью игнорировать эту ошибку я не хочу.
Хочется найти способ инкапсулировать все что касается общения с серверов в одном месте.
Гуглил на данную тему, и нашел способ лежащий на поверхности:
Проверять жив ли сервер до того как делать к нему запрос, для этого я написал следующий код:
throw new SoapFault('server unavailable',"Can't connect to server $errno$errstr");
}
}
Но как вы понимаете такой способ не работает, fsockopen даже при лежащем сервере возвращает true. Видимо я не доконца разобрался с fsockopen.
Стоит отметить что вариант "делать запрос и проверять какой заголовок пришел в ответе" совсем не канает, т.к. если сервер умирает, то умирает капитально. И никакого ответа мы не получим, и в добавок еще потратим кучу времени на ожидание ответа.
Системный вызов пинга тоже не сработает, т.к. сервер пингуется, а вот ВЕБ часть на нём умирает.
Вообещм подскажите оптимальный способ которым вы решали подобные проблемы
Есть рекурсивная функция, которая строит меню из базы. В базе все свалено в одну таблицу, где наследование родитель-потомок осуществляется по столбцам parent и id
Функция просто проходит по все пунктам и составляет многомерный массив. Но мне понадобилось что бы он еще и строил правильные ссылки, с вложенностью. В базе они находятся только со своим кейвордом (выборка идет по нему).
Вот строке 16, где комментарий "составляем правильный регламентированный ури" и есть интересующая меня часть кода.
Я хочу чтоб из тех кейвордов что берутся из базы состовлялось что то вроде level/sublevel1/sublevel2/ и т.д. где каждый сегмент это keyword отдельного пункта.
Они должны наращиваться по мере углубления вовнутрь. Но при моей реализации они наращиваются не только в глуб, но и в ширь, т.е. добавляются кейворды братьев, т.е. при каждом запуске рекурсии...
Вот я никак не могу додуматься как сделать так, что бы функция понимала что она сейчас находится на одном уровне, и добавляла сегменты только при переходе к следующему вложенному сегменту.
Я уже пытался сделать путем ввода счетчика, (в параметрах функции осталась переменная level), но счетчик так же увеличивается при каждом запуске рекурсии, и как ограничить область видимости я так и не додумался.
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 и может чего то не улавливаю?
Подскажите пожалуйста...