Intereting Posts

Как поместить проверку ошибок для simplexml_load_file?

Я использую Tumbrl API для загрузки нескольких сообщений на мою домашнюю страницу. У меня есть следующий вызов:

$xml = simplexml_load_file($request_url); 

Иногда он загружается нормально, но в других случаях я получаю этот результат:

 Warning: simplexml_load_file(http://mysite.tumblr.com/api/read?type=post&start=0&num=10&type=photo) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable in mysite.com/html/index.php on line 624 Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://mysite.tumblr.com/api/read?type=post&start=0&num=10&type=photo" in mysite.com/html/index.php on line 624 

Какую проверку ошибок я должен выполнить, чтобы не показывать предупреждение на странице?

Способ проверки отказа этой функции – проверить false возвращаемое значение.

simplexml_load_file также запускает предупреждение PHP старого стиля, когда он терпит неудачу. Если у вас есть предупреждения, но вы хотите подавить предупреждение по любой причине, вы можете использовать @ :

Таким образом, вы можете использовать

 $element = @simplexml_load_file($file); if ($element === false) { // error! } 

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

Обновление марта 2014 года

В качестве предостережения я должен добавить, что использование оператора «@» для подавления ошибки – плохая идея в целом. Если есть альтернатива, вы должны использовать ее. Если альтернативы нет, вы должны попытаться ограничить часть, покрытую «@», до наименьшей возможной части.

Причиной этого является то, что «@» переопределяет любые настройки обработки ошибок, установленные глобально (так же, как установка error_reporting() в вашем коде). Поэтому, если вы задали PHP для регистрации ошибок, а не для их отображения, например, эта ошибка даже не будет регистрироваться. Также легко случайно подавить больше ошибок, чем вы предполагаете с помощью «@», включая ошибки, о которых вы хотели бы знать. Например, использование @myfunction($something) будет подавлять ошибки, которые происходят где-либо в этой функции, или в функциях, которые работают по очереди. Так что это просто что-то, что нужно помнить об этом операторе.

В этом случае, поскольку вы проверяете удаленные файлы по HTTP, обычная альтернатива использованию «@» не идеальна. Например, для локальных файлов вы можете использовать следующее, чтобы избежать «@»:

 if (file_exists($file)) { $element = simplexml_load_file($file); } else { // error! } 

Но в вашем случае, поскольку это вызов удаленного файла через HTTP, приведенное выше приведет к двум запросам, и если первый запрос будет успешным, а второй – неудачным, вы получите сообщение об ошибке. В вашем случае оператор «@», конкретно ограниченный вашим simplexml_load_file() , вероятно, лучший.