我写的一个网络应用程序,这将允许用户指定的URL SoapClient.我想验证php可以连接到客户的户提交形式。我thouhgt我可以这样做,通过试图赶上或set_error_handler(或一些组合的两个)。但是它看起来像这是不可能的致命错误。有没有办法得到SoapClent测试一个网址,不会引发不可恢复的错误?

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://example.com/wibble'

我希望这标志一个错误,因为该网址不存在,但我希望能够抓住它。

否则我想我可以尝试下载和验证URL自己,但我们认为,这将是可能做到这一点从SoapClient.

这应该是一个致命的错误?

编辑

在阅读rogeriopvl的答案,我reaslise,我应该说,我曾试图'的例外情况'的选择soapclient构造和(在绝望)的使用肥皂差错处理程序功能。

有帮助吗?

解决方案

您使用的是xdebug吗?根据此PHP错误报告和讨论,该问题至少已得到解决PHP 5.1,但是这个xdebug错误混淆了“异常转换的致命错误”一种不产生异常并且致命错误“泄漏”的方式。

我可以在本地重现这个,启用xdebug:

try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

这给了我描述的致命错误,甚至没有输入catch子句:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

如果我在通话前禁用xdebug ,则可以使用

xdebug_disable();
try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

这会按预期触发异常,并在catch子句中获得一个正确的SoapFault对象,并带有以下消息:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

所以基本上异常的工作与宣传的一样。如果它们在您的情况下不起作用,您可能会遇到xdebug错误,或者与其他第三方组件有类似问题。

其他提示

引用 SoapClient文档

  

exception选项是一个布尔值,用于定义soap错误是否抛出SoapFault类型的异常。

所以你应该尝试类似的东西:

$client = new SoapClient("some.wsdl", array('exceptions' => TRUE));

这种方式会抛出 SoapFault 异常,让您抓住它们

请参阅: http://bugs.xdebug.org/view.php?id= 249个

可能的解决方案:

Index: trunk/www/sites/all/libraries/classes/defaqtoSoapClient.class.php
===================================================================
--- classes/defaqtoSoapClient.class.php
+++ classes/defaqtoSoapClient.class.php
@@ -31,10 +31,23 @@

     try {
+        // xdebug and soap exception handling interfere with each other here 
+        // so disable xdebug if it is on - just for this call
+        if (function_exists('xdebug_disable')) {
+            xdebug_disable();
+        }
       //Create the SoapClient instance
       parent::__construct($wsdl, $options);
     }
     catch(Exception $parent_class_construct_exception) {
+        if (function_exists('xdebug_enable')) {
+            xdebug_enable();
+        }
       // Throw an exception an say that the SOAP client initialisation is failed
       throw $parent_class_construct_exception;
+    } 
+    if (function_exists('xdebug_enable')) {
+        xdebug_enable();
     }
   }

您可以尝试执行curl或fsockopen请求以检查URL是否有效。

对于您的信息,我使用的SoapClient与进行测试远程web服务,并得到了同样的问题!

  • 当使用老进行的版本(3.3.x)作为第三方进行的崩溃
  • 在使用当前版本进行(3.4.6)作为第三方进行的显示"异常".

这里是我的第一个试验方法:

public function testUnavailableURL() {
    $client = new SoapClient("http://wrong.URI");
}

这里是进行第一结果:

There was 1 error:

1) MyTestCase::testUnavailableURL
RuntimeException: 


FAILURES!

这里是我的第二个试验方法:

public function testUnavailableURL() {
        try {
          $client = @new SoapClient("http://wrong.URI");
        } catch (SoapFault $fault) {
          print "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})";
        }
}

这里是进行第二次试验的结果:

PHPUnit 3.4.6 by Sebastian Bergmann.

.SOAP Fault: (faultcode: WSDL, faultstring: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://wrong.URI' : failed to load external entity "http://wrong.URI"
)...

Time: 3 seconds, Memory: 4.25Mb

OK

NB:我发现一票进行关于这个问题: 票417

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top