Устранение ошибок PHP SOAP

Я получаю отчаяние, все, что я хочу, – это простая обработка ошибок, когда веб-служба PHP SOAP отключается, чтобы эхо-сообщение службы входа в систему с ошибкой. Пожалуйста, помогите мне!

В настоящий момент все еще отображается ошибка (наряду с предупреждениями):

Fatal error: SOAP-ERROR: Parsing WSDL

Вот сценарий:

 <?php session_start(); $login="0000000000000nhfidsj"; //It is like this for testing, It will be changed to a GET $username = substr($login,0,13); //as password is always 13 char long //(the validation is done int he javascript) $password = substr($login,13); try { ini_set('default_socket_timeout', 5); //So time out is 5 seconds $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl"); //locally hosted $array = $client->login(array('username'=>$username, 'password'=>$password)); $result = $array->return; }catch(SoapFault $client){ $result = "0"; } if($result == "true")//as this would be what the ws returns if login success { $_SESSION['user'] = $login; echo "00"; } else { echo "01 error: login failed"; } ?> 

Fatal error: SOAP-ERROR: Parsing WSDL Значит, WSDL ошибочен и, возможно, отсутствует? поэтому он не связан с мылом. И вы не можете справиться с FATAL ERROR с помощью try catch. См. Эту ссылку: http://ru2.php.net/set_error_handler#35622

Что вы получаете, когда пытаетесь получить доступ к http://192.168.0.142:8080/services/Logon?wsdl в своем браузере?

Вы можете проверить, присутствует ли WSDL, как это

 $handle = curl_init($url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($handle); $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); if($httpCode == 404) { /* You don't have a WSDL Service is down. exit the function */ } curl_close($handle); /* Do your stuff with SOAP here. */ 

Хотя включение исключений, упомянутых в приведенном выше замечании, является хорошим шагом для обработки ошибок синтаксического анализа, этого недостаточно, поскольку SOAP может привести к фатальной ошибке с использованием встроенных функций php.

Поэтому сначала вам нужно включить обработку исключений:

 try { $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array( 'exceptions' => true, )); } catch ( SoapFault $e ) { // Do NOT try and catch "Exception" here echo 'sorry... our service is down'; } 

И затем вам также необходимо тихо подавлять любые «ошибки PHP», которые происходят из SOAP с помощью настраиваемого обработчика ошибок:

 set_error_handler('handlePhpErrors'); function handlePhpErrors($errno, $errmsg, $filename, $linenum, $vars) { if (stristr($errmsg, "SoapClient::SoapClient")) { error_log($errmsg); // silently log error return; // skip error handling } } 

Затем вы обнаружите, что вместо этого вызывается исключение SoapFault с правильным сообщением «Ошибка soap: SOAP-ERROR: Разбор WSDL: не удалось загрузить из« … », и поэтому вы вернетесь в свой оператор catch, способный обрабатывать ошибка более эффективно.

К сожалению, SOAP вызывает фатальную ошибку, когда служба недоступна или недоступна, а не возвращает объект SoapFault.

При этом вы можете установить для него исключение. Вероятно, вы опустили ту часть, где вы устанавливаете опцию soap_client исключений на false

 $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array( 'exceptions' => false, // change to true so it will throw an exception )); 

Поймать исключение, когда служба недоступна:

 try { $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array( 'exceptions' => true, )); } catch ( Exception $e ) { echo 'sorry... our service is down'; } 

Возможно, лучшая альтернатива:

 set_error_handler('my_error_handler'); set_exception_handler('my_exception_handler'); function my_exception_handler($e) { exit('Error, something went terribly wrong: '.$e); } function my_error_handler($no,$str,$file,$line) { $e = new ErrorException($str,$no,0,$file,$line); my_exception_handler($e); } 

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

Скажем, вы отправляете сообщение о мыле после первоначального входа в систему, и этот ответ никогда не приходит или не приходит только частично, таким образом вы можете вернуть сообщение без каких-либо путей, имен и ленточных номеров сценариев. В таких случаях я вообще не возвращаю $ e, вместо этого я просто выводил что-то вроде: «Что-то пошло не так, попробуйте еще раз (позже)».

SoapFault не расширяет Exception, улавливает работу определенного типа:

 try { $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array( 'exceptions' => true, )); } catch ( SoapFault $e ) { echo 'sorry... our service is down'; }