SoapServer-> handle()忽略输出缓冲

时间:2015-03-25 15:04:05

标签: php soap buffering output-buffering soapserver

我试图捕获PHP的SoapServer类发送的响应,以便在实际发送到浏览器之前进行调试。

我正在使用Zend_Soap_Server,它应该允许使用输出缓冲从SoapServer->handle()捕获输出。但是,handle方法似乎完全忽略了缓冲区,直接发送到浏览器并终止请求。

这是直接取自Zend_Soap_Server->handle()方法的摘录。

ob_start();
if ($setRequestException instanceof Exception) {
    // Create SOAP fault message if we've caught a request exception
    $fault = $this->fault($setRequestException->getMessage(), 'Sender');
} else {
    try {
        $soap->handle($this->_request);
    } catch (Exception $e) {
        $fault = $this->fault($e);
    }
}
$this->_response = ob_get_clean();

从上面可以看出,$soap->handle()的输出应该在缓冲区中捕获,并使用$this->_response分配给ob_get_clean()。虽然$soap->handle()正在结束请求,但PHP似乎永远不会达到这一点。

如果我在缓冲区中回显一个字符串,它就不会被发送到浏览器并且被正确缓冲,这让我觉得$soap->handle()正在做一些破坏它的事情。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

事实证明,由于请求命名空间问题(无法找到过程方法),PHP在handle方法中抛出致命错误。

当SOAP响应编译过程中发生致命事件时,它会被格式化为SOAP响应并在进程暂停之前发送到浏览器,这意味着任何输出都将转义缓冲区。

我希望这有助于将来偶然发现这一点的任何人。