PHP не столь фатальные ошибки с "новым SoapClient ()"

У меня есть этот фрагмент:

foreach($config as $wsInfo){ try{ $soapClient = new SoapClient($wsInfo['url'], array('encoding'=>'ISO-8859-1')); // Some more code that I commented out. } catch(Exception $e){ echo "EXCEPTION: \n" . $e->getMessage(); // log it, etc. } } 

Когда я запускаю программу, URL-адрес веб-службы отвечает мне ошибкой проверки подлинности (что хорошо в этой точке разработки).

Поведение Extrange, которое я отмечаю, – это то, что я ожидал этого:

 $ php scan.php -p=/ -c=config.yml EXCEPTION: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://webservices.myserver.com/api.asmx?WSDL' : failed to load external entity "http://webservices.myserver.com/api.asmx?WSDL" EXCEPTION: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://webservices.myserver.com/api.asmx?WSDL' : failed to load external entity "http://webservices.myserver.com/api.asmx?WSDL" 

Это дает мне следующее:

 $ php scan.php -p=/ -c=config.yml PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://webservices.myserver.com/api.asmx?WSDL' : failed to load external entity "http://webservices.myserver.com/api.asmx?WSDL" in /home/me/project/DFPushSOAP.php on line 34 EXCEPTION: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://webservices.myserver.com/api.asmx?WSDL' : failed to load external entity "http://webservices.myserver.com/api.asmx?WSDL" PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://webservices.myserver.com/api.asmx?WSDL' : failed to load external entity "http://webservices.myserver.com/api.asmx?WSDL" in /home/me/project/DFPushSOAP.php on line 34 EXCEPTION: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://webservices.myserver.com/api.asmx?WSDL' : failed to load external entity "http://webservices.myserver.com/api.asmx?WSDL" 

Почему «Неустранимая ошибка PHP» не убивает программу? И почему это ускользает от блока try / catch?

Как я могу избежать этого?

У меня была та же проблема, и я нашел решение на https://bugs.php.net/bug.php?id=47584 .

Сначала вы должны установить опции exceptions , чтобы заставить SoapClient выбрасывать исключения:

  $soapClient = new SoapClient($wsInfo['url'], array('encoding'=>'ISO-8859-1' 'exceptions' => true )); 

в моем случае xdebug заставлял производить Fatal Error вместо catchable Exception. Поэтому вы должны попытаться отключить xdebug для создания SoapClient:

  if(function_exists('xdebug_disable')){ xdebug_disable(); }; $soapClient = new SoapClient($wsInfo['url'], array('encoding'=>'ISO-8859-1' 'exceptions' => true )); if(function_exists('xdebug_enable')){ xdebug_enable(); }; 

надеюсь, это поможет вам ^^

Решение с временным отключением xdebug не работает для меня (запуск PHP 7.0.12 / amd64) с включенным xdebug).

Ответы на указанную ошибку на странице https://bugs.php.net/bug.php?id=47584 показывают решение с пользовательским временным обработчиком ошибок. Посмотреть сообщение от _ [2012-10-03 09:36 UTC] james dot silver at computminds dot co dot uk_.

Как грязное обходное решение вы можете деактивировать error_reporting()

 $level = error_reporting(); error_reporting(0); $soapClient = new SoapClient($wsInfo['url'], array( 'encoding'=>'ISO-8859-1' 'exceptions' => true ) ); error_reporting($level); 

Но пользовательский обработчик ошибок выглядит более приятным. См. https://stackoverflow.com/a/12565073/4351778