PHP 中的 SoapClient 错误回退

Posted

技术标签:

【中文标题】PHP 中的 SoapClient 错误回退【英文标题】:SoapClient error fallback in PHP 【发布时间】:2011-09-30 06:54:06 【问题描述】:

php 中,如果您尝试实例化一个新的 SoapClient,并且无法访问 WSDL(服务器关闭或其他),则会引发 PHP 致命错误:

致命错误:SOAP-ERROR:解析 WSDL: 无法从 'http://example.com/servlet/app/SomeService?wsdl' : 未能加载外部实体 "http://example.com/servlet/app/SomeService?wsdl"

据我所知,PHP 中的致命错误无法恢复。

有什么办法可以回退吗?能否以某种方式避免这种致命错误?


编辑:我应该说我在 PHP 5.2 上运行,如果有什么不同的话。

【问题讨论】:

【参考方案1】:

这已经讨论过了:

https://bugs.php.net/bug.php?id=47584 http://www.php.net/manual/en/class.soapclient.php#104046

拉斯穆斯本人提出了以下解决方案:

<?php  
try   
    $x = @new SoapClient("non-existent.wsdl",array("exceptions" => 1));  
 catch (SoapFault $E)   
    echo $E->faultstring; 
  
echo "ok\n";

【讨论】:

不幸的是,这个解决方案似乎不适用于 PHP 5.3.10。 我将它逐字复制到一个新文件中,但它没有得到回显“Ok”;部分。 但是,当我往下看时,我确实找到了关于禁用 xdebug 的注释,并且允许上述操作。【参考方案2】:

看到这个话题How do I catch a PHP Fatal Error

基本上您无法从致命错误中恢复,但您可以在注册关闭功能时为用户提供更好的体验

register_shutdown_function('handleShutdown');
function handleShutdown()
    $error = error_get_last();
    if($error !== NULL)
        echo "Sorry for the inconvenience, an error just occurred.";
    

【讨论】:

最佳实践是肯定地尝试捕获。

以上是关于PHP 中的 SoapClient 错误回退的主要内容,如果未能解决你的问题,请参考以下文章

PHP - SoapClient::SoapClient 无法打开流:连接被拒绝

是否可以将元素名称映射到 php 类(SoapClient)

PHP SoapClient over selfsigned certificate,SOAP-ERROR:解析WSDL:无法从'https://加载

PHP SoapClient 超时

python 有没有php里面的soapclient这样的东西

PHP 5 soapClient 结果为空 __getLastResponse 显示正确的 XML