PHP SOAP错误:获取HTTP标头时出错

6
我正在处理一个通过SOAP连接处理大量数据的PHP脚本。如果没有遇到任何错误,该脚本的总运行时间估计为几天。我遇到的问题是,脚本将运行一段时间,从一小时到一天不等,然后SOAP连接将因错误“error fetching http headers”而中断。
我看过许多文章建议增加“default_socket_timeout”设置,我已经尝试过了,但没有帮助。我知道它在工作,因为它至少会成功调用一百次,然后才会失败。有什么方法可以防止这个错误吗?
更新: 我打印出请求和响应头,希望能在其中看到错误。但看起来它们都很好:
HTTP/1.1 200 OK Date: Wed, 25 Sep 2013 21:00:12 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.3.3 Content-Length: 516 Connection: close Content-Type: text/xml; charset=UTF-8
就示例代码而言,实际脚本非常长,但基本原理如下:
ini_set('default_socket_timeout', 120);
$client = new SoapClient($wsdl,array(
    'trace' =>true,
    'connection_timeout' => 500000,
    'cache_wsdl' => WSDL_CACHE_BOTH,
    'keep_alive' => true,
));
while(!$finished) {
    $finished = $client->someSoapFunction($data);
}

someSoapFunction() 会在 100 个连接中返回有效数据,然后随机返回上述错误。它所运行的时间少于两个设置的超时时间。我在我的 php 或 Apache 错误日志中没有发现任何错误。我感到困惑。


2
有关您编写的代码问题的问题必须在问题本身中描述具体问题,并包括可重现问题的有效代码。 - Kermit
1个回答

7

我知道这是一个老问题,但也许我的解决方案对其他人有用。 我遇到了同样的问题,通过在创建SoapClient对象时将“keep_alive”参数更改为false,我的问题得到了解决:

$client = new SoapClient($wsdl,array(
'trace' =>true,
'connection_timeout' => 500000,
'cache_wsdl' => WSDL_CACHE_BOTH,
'keep_alive' => false,
));

据我所知,此解决方案仅适用于PHP> = 5.4,因为在较低版本中keep_alive选项不可用。但是,它应该在您的Web服务器配置中可用。 - xmoex
非常感谢,经过三天的搜索,这终于解决了我们的问题。 - Bas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接