|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [2017-11-28 21:33 UTC] ryan dot jentzsch at gmail dot com
 Description: ------------ Subclassing the SoapClient class and wrapping the call to the parent constructor will throw a fatal error even when wrapped in a try...catch(\Throwable $t). With PHP 7 try...catch(\Throwable $t) being a convenient method of adding fault tolerance and graceful degradation -- it is therefore very frustrating when a WSDL PARSE issue is encountered that an UNCATCHABLE script exiting fatal error is issued. Related: 60780, 45093, (XDEBUG specific: 34657, 49587) SO "work-around": https://stackoverflow.com/questions/6952814/php-soap-error-catching Test script: --------------- <?php class SoapAgent extends \SoapClient { public function __construct(string $wsdl) { try { parent::__construct($wsdl); echo 'Success!' . PHP_EOL; } catch (\Throwable $t) { var_dump($t); } } } $client = new SoapAgent('bogus'); Expected result: ---------------- var_dump() of the Throwable object. Actual result: -------------- Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'bogus' : failed to load external entity "bogus" Process finished with exit code 255 PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Fri Oct 31 20:00:01 2025 UTC | 
running `php -n` is not useful since PHP will not compile dying on Line 2: Fatal error: Class 'SoapClient' not found in /home/ryan/wsdl.php on line 2 Now without the `-n` switch PHP emits a warning, and then PHP commits suicide: ``` PHP Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "bogus" in /home/ryan/wsdl.php on line 7 PHP Stack trace: PHP 1. {main}() /home/ryan/wsdl.php:0 PHP 2. SoapAgent->__construct() /home/ryan/wsdl.php:15 PHP 3. SoapAgent->SoapClient() /home/ryan/wsdl.php:7 PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'bogus' : failed to load external entity "bogus" in /home/ryan/wsdl.php on line 7 PHP Stack trace: PHP 1. {main}() /home/ryan/wsdl.php:0 PHP 2. SoapAgent->__construct() /home/ryan/wsdl.php:15 PHP 3. SoapAgent->SoapClient() /home/ryan/wsdl.php:7 ```nikic@php.net you are correct that it is similar. I just ran the phpt test and this fix is in place and works (if SoapClient is not extended). If the SoapClient class is extended with a try...catch in the __constructor() the point of failure is at parent::__construct('bogus); Forcing other throwables will actually get caught. It is the `parent::__construct()` where the try...catch is short circuited. I traced the C code down for this a while ago. Internally PHP is calling some XML loading/handling utility modules. These have `zend_bail()` logic in them that is causing PHP to commit suicide.