2

我使用 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,它显示了捕获和处理错误的正确方法。但我会接受人们可能提供的任何帮助。

4

2 回答 2

1

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

Xdebug 可能是问题所在。在调用 handle() 方法之前使用 xdebug_disable() 时,服务器会以正确的 SOAP 消息进行响应,该消息表明出现了问题。

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

于 2012-04-20T14:34:05.547 回答
0

如果您发送一个错误的 XML,Zend 框架会发送一个 SoapFault Exception :

// 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。对不起。我正在寻找... ;)

于 2011-01-03T14:19:27.353 回答