|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-03-06 07:42 UTC] gem at rellim dot com
Description:
------------
Basically bug# 34657 says it all, except the bug is not bogus.
I am NOT running Xdebug and any problem reading the remote WSDL
causes a fatal error which makes it impossible to inform the
user nicely of the problem.
Reproduce code:
---------------
$client = new SoapClient('http://google.com');
Expected result:
----------------
I would like to see a catchable error or an error return;
Actual result:
--------------
PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://google.com'
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 06:00:01 2025 UTC |
Why does it work OK for you and not for me? Just because it works on one host for you does not mean it does not fail for me. This is the entire program to reproduce: <?php $client = new soapClient('http://google.com'); ?> PHP Fatal error: SOAP-ERROR: Parsing WSDL: XXXX I can reproduce on several different hosts. I am not running Xdebug, eaccelerator, or any other add in.BTW despite SoapClient emits a fatal error it already throws exception which can be caught (even in 5.2 brunch). <?php try { $x = new SoapClient("non-existent.wsdl"); } catch (Exception $e) { } echo "ok\n";' ?>Your example fails for me, I can not catch the error: # cat tmp.php <?php try { $x = new SoapClient("non-existent.wsdl"); } catch (Exception $e) { } echo "ok\n"; ?> # php tmp.php PHP Warning: SoapClient::SoapClient(): I/O warning : failed to load external entity "non-existent.wsdl" in /tmp/tmp.php on line 3 PHP Stack trace: PHP 1. {main}() /tmp/tmp.php:0 PHP 2. SoapClient->SoapClient() /tmp/tmp.php:3 PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'non- existent.wsdl' : failed to load external entity "non-existent.wsdl" in /tmp/tmp.php on line 3 PHP Stack trace: PHP 1. {main}() /tmp/tmp.php:0 PHP 2. SoapClient->SoapClient() /tmp/tmp.php:3 #Forgot my version details: # php -v PHP 5.3.3 (cli) (built: Jul 26 2010 14:55:07) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick RethansIt fails similarly without XDebug: # php -v PHP 5.3.3 (cli) (built: Jul 26 2010 14:55:07) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator # php tmp.php PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'non- existent.wsdl' : failed to load external entity "non-existent.wsdl" in /tmp/tmp.php on line 3 ok #It is a catchable fatal though. eg. <?php try { $x = @new SoapClient("non-existent.wsdl",array("exceptions" => 1)); } catch (SoapFault $E) { echo $E->faultstring; } echo "ok\n";Not catchable for me with XDebug and your example: # cat tmp.php <?php try { $x = @new SoapClient("non-existent.wsdl",array("exceptions" => 1)); } catch (SoapFault $E) { echo $E->faultstring; } echo "ok\n"; ?> # php tmp.php #The above solution(s) worked for me on an Ubuntu server, but not on IIS. My final solution added in a custom error handler which did the trick - e.g: <?php if (function_exists('xdebug_disable')) { xdebug_disable(); } set_error_handler('my_custom_soap_wsdl_error_handler'); new SoapClient('http://google.com', array('exceptions' => TRUE)); restore_error_handler(); if (function_exists('xdebug_enable')) { xdebug_enable(); } function my_custom_soap_wsdl_error_handler($errno, $errstr, $errfile = NULL, $errline = NULL, $errcontext = NULL) { // Simulate the exception that Soap *should* have thrown instead of an error. // This is needed to support certain IIS server setups it would seem. $wsdl_url = isset($errcontext['wsdl']) ? $errcontext['wsdl'] : ''; $msg = "SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl_url . "' : failed to load external entity \"" . $wsdl_url . "\""; if (class_exists('SoapFault')) { $e = new SoapFault('WSDL', $msg); } else { $e = new Exception($msg, 0); } throw $e; } ?>This is a bug in PHP 7.0.0 VC14 X64 with Apache 2.4.17 (Win64) VC14 I am NOT running Xdebug. Occurs on Windows 7 Professional (my development environment). class MaddSoapClient extends SoapClient { public function __construct($wsdl, $options = null) { // Created some code to make sure the wsdl is valid $isValid = true; if($isValid) { try { if($options != null) @parent::SoapClient($wsdl, $options); else @parent::SoapClient($wsdl); } catch(SoapFault $sf) { // log SF } catch(Exception $e) { // log Exception } } } } $msc = new MaddSoapClient("http://qasynergize.tmwsystems.com/SynWebService/Explorer.asmx?wsdl", array("exceptions" => true, 'connection_timeout' => 0, 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP)); The above error handler hacks don't work. Email me for any settings information you like. PHP 5.6.16 VC11 X64 throws an out of memory error but still works with the above code. PHP 5.4.45 works regardless.