PHPSOAP-获取http头时出错-但仅适用于许多调用中的少数调用
我们在一个项目上切换服务器,该项目在一行中从客户机到服务器建立了18个soap连接。在旧服务器上,我们对此没有问题,但在新服务器上,总是一个特定的调用导致获取http头时出现PHPSOAP-获取http头时出错-但仅适用于许多调用中的少数调用,php,soap,Php,Soap,我们在一个项目上切换服务器,该项目在一行中从客户机到服务器建立了18个soap连接。在旧服务器上,我们对此没有问题,但在新服务器上,总是一个特定的调用导致获取http头时出现错误错误,有时另一个调用也会以同样的方式失败。其他电话都很好 所有通话遵循完全相同的原则: 数据收集并存储在一个数组中(这是这些调用的唯一区别——提交的数据) 数组编码为json json字符串被添加到ZIP文件中 ZIP文件的内容使用openssl加密 加密字符串是base64编码的 编码的字符串被发送到服务器 在18个电
错误
错误,有时另一个调用也会以同样的方式失败。其他电话都很好
所有通话遵循完全相同的原则:
$client = new SoapClient(
null, array(
'location' => $location,
'uri' => $urn,
'trace' => 1
)
);
try
{
// generate new object
$auth=new authentication_header($system['Username'], $system['Password']);
// create authentication header values
$authvalues=new SoapVar($auth, SOAP_ENC_OBJECT, 'authenticate');
// generate header
$header=new SoapHeader("domain.com", "authenticate", $authvalues, false, "http://schemas.xmlsoap.org/soap/actor/next");
/* *****************************
* SEND DATA *
***************************** */
$result = $client-> __soapCall("Process",array($b64String, $key, $system['UserId'], $fileSize, $connectionTest), null, $header);
//handle response
[...]
}
catch(SoapFault $e)
{
$msg = $e->getMessage();
echo "\n<br>Unknown error: " . $msg . "<br>\n";
$response = $client->__getLastResponseHeaders();
echo $response . "<br>\n";
Datapipe_Error_Log($msg, $response);
return false;
}
catch(Exception $e)
{
//write out the error
echo "Exception:<br>";
var_dump($e);
Datapipe_Error_Log('Datapipe Exception', $e);
return false;
}
对于这个调用,file\u put\u contents
函数似乎从未执行过
我可以看出,可能有太多的连接打开,因为这些调用非常快速地连续发生,我们在客户机上使用PHP5.3.5(服务器在5.6.1上)。但是我尝试实现我在这里添加的链接中描述的解决方案($this->httpsocket=NULL;
在SoapClient
的扩展中),没有任何更改
由于特定的原因,我们无法在客户端上更新PHP版本,但是客户端没有为此测试进行更改。我们的Linux伙计创建了一个新服务器,所有的东西都工作了——除了这个调用失败
设置default\u socket\u timeout
被设置为60(至少当我从终端窗口使用php-a
时是这样),但到目前为止,每个调用的响应时间都不到半秒
添加
var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());
对代码进行修改,结果显示正确的XML数据作为请求,NULL作为最后一个响应
发生这种情况时,服务器总是抛出此错误:
[Wed Nov 12 15:23:03.080700 2014] [core:notice] [pid 9731] AH00052: child pid 10276 exit signal Segmentation fault (11)
据我所知,除了Zend之外,没有运行第三方扩展。下面是php-v
输出:
PHP 5.6.1 (cli)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
下面是php-m
:
[PHP Modules]
Core
ctype
date
dom
ereg
filter
hash
iconv
json
libxml
mhash
mysql
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Reflection
session
SimpleXML
soap
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zip
zlib
[Zend Modules]
我有超过5GB的可用RAM(free-m
),所以我也不这么认为(有些帖子提到了由循环引起的内存问题——但是,在执行任何大的操作之前,代码都会失败……)
以下是Apache重新启动时错误日志中的一些相关条目,可能会有所帮助:
[Wed Nov 12 13:57:59.063896 2014] [mpm_prefork:notice] [pid 9677] AH00163: Apache/2.4.10 (Linux/SUSE) OpenSSL/1.0.1i-fips PHP/5.6.1 configured -- resuming normal operations
[Wed Nov 12 13:57:59.063980 2014] [core:notice] [pid 9677] AH00094: Command line: '/usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D SSL -D SYSTEMD -D FOREGROUND'
这是我能解决的最大问题,直到你的Linux助手在两天后回来,不幸的是,gdb
似乎没有安装,我不想在没有管理员同意的情况下对服务器造成太多麻烦
在这一点上,我必须假设这是一个损坏的PHP或Apache安装或版本冲突或其他什么
---更新---
我再次运行了测试并禁用了其中两个调用,以查看问题是否仍然存在,即使所讨论的调用不再是循环的第17个条目。是的,还是同一个电话失败了。因此,失败似乎与之前打了多少电话无关。它似乎总是使用数组中的特定参数影响调用
但到现在为止,我已经更改了这次通话的所有提交数据,甚至添加了1kB的空间,看看这是否会有所不同——仍然是同一个问题。我想不出还有什么可以改变的东西可以解释这一点
---结束更新---
我还有什么想法可以试试吗?试试“让你活着”=>错
$client = new SoapClient($wsdl,array(
'trace' => true,
'cache_wsdl' => WSDL_CACHE_BOTH,
'keep_alive' => false
));
$client = new SoapClient($wsdl,array(
'trace' => true,
'cache_wsdl' => WSDL_CACHE_BOTH,
'keep_alive' => false
));