无法处理PHP的SoapServer-> handle()方法中的错误

时间:2010-07-10 01:10:04

标签: php zend-framework soap error-handling zend-soap

我使用PHP 5.3创建了一个基于WSDL的SOAP Web服务。我正在使用Zend Framework来处理服务,而ZF依次是PHP的内置SoapServer类。

在使用SoapUI进行测试时,我发现传递无效类型的参数(例如,在WSDL定义整数时传递字符串)会导致空响应。深入研究代码,我发现当ZF调用SoapServer-> handle()时,执行会因此致命错误而死:

Fatal error: SOAP-ERROR: Encoding: Violation of encoding rules

错误是有道理的,但对于我的生活,我无法弄清楚如何捕捉它,以便我可以优雅地处理它。我的理解是handle()应该抛出异常,但它只是简单地死了。

但是这里真的很奇怪......

使用SoapUI运行多个测试,而不进行任何代码更改,会产生不同的结果。大多数时候,我得到空洞的回应,但偶尔,我会回到SoapFault(我期待的!)。然而,这并不一致,我无法弄清楚是什么触发它。据我所知,我关闭了SoapUI中的缓存功能,以及WSDL缓存。我不知道它是否与SoapUI或PHP有关。正如我所说,很奇怪。

相关,我发现了这个旧的PHP错误:

http://bugs.php.net/36629

这听起来像我自己的问题。但是,我并不完全相信这是我的问题,主要是因为涵盖所有这些的PHP文档以及ZF的文档都非常不完整。因此,我可能只是做一些非常错误而且不知道的事情。鉴于此,我很乐意看到一个简单的shell,它显示了陷阱和处理错误的正确方法。但我会接受那里的人可能提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以尝试评论:https://bugs.php.net/bug.php?id=50547#1298563236(页面上的第三条评论)?

  

Xdebug可能是个问题。在调用之前使用xdebug_disable()时   handle()方法,服务器使用适当的SOAP消息进行响应   出了点问题。

我有完全相同的问题(有时是空响应,有时是正确的SoapFault)。 xdebug_disable()救了我。

答案 1 :(得分:0)

如果发送错误的XML,Zend Framework会发送SoapFault异常:

// Zend/Soap/Server.php line 818
try {
    $this->_setRequest($request);
} catch (Zend_Soap_Server_Exception $e) {
    $setRequestException = $e;
}

使用此代码,只有Exception被转换为SoapFault。 但是所有PHP错误都不会抛出异常,而SoapServer也不会显示错误:

// Zend/Soap/Server.php line 857
protected function _initializeSoapErrorContext()
{
    $displayErrorsOriginalState = ini_get('display_errors');
    // Delete this line to view error in developement
    ini_set('display_errors', false);

    set_error_handler(array($this, 'handlePhpErrors'), E_USER_ERROR);
    return $displayErrorsOriginalState;
}

我不知道如何一直返回SoapFault。抱歉。 我正在寻找...;)