У меня есть этот фрагмент:
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