对自制 SOAP 服务器的第二次 SOAP 调用使 apache 产生段错误


Second soap call to self made soap server makes apache produce a segfault

大家好,我已经为此绞尽脑汁了两个星期了。

问题是我做了一个肥皂服务,似乎工作正常。当我要求它显示它的函数时,它会将它们全部返回等。但是当我尝试向服务器调用两个函数时,出现段错误错误:

'[通知] 子 PID 13950 退出信号分段错误 (11('

但是当我分别调用这两个函数时,它们会起作用。我在谷歌上搜索了一个星期,并尝试了不同的 wsdl 格式,但唯一出现的是可能的 php 错误或 wsdl 中的一些错误(这似乎不太可能,因为我的验证器找不到错误(。

浏览器给了我这个回应:

错误 324(网络::ERR_EMPTY_RESPONSE(

我目前正在运行 php 版本 5.3.6,并且还尝试了 5.2.17 以尝试消除可能的 php 错误。但他们都给出了同样的错误。

办公室里没有人知道如何解决这个问题,因为"一切都应该没事"。
谁能让我朝着正确的方向前进?

客户端:(此代码导致 Apache 崩溃(

ini_set('soap.wsdl_cache_enabled', 0); 
ini_set('soap.wsdl_cache_ttl', 0);
try{
    $soap = new SoapClient("http://localhost/virtueleincasso.wsdl", array("exceptions" => 1));
    $password = $soap->virtuele_incasso_login('user', 'pass');       
    $status = $soap->get_status($password , 1060);
}catch (SoapFault $exception){
    echo $exception->faultstring;
}

服务器:

ini_set('soap.wsdl_cache_enabled', 0); 
ini_set('soap.wsdl_cache_ttl', 0);
$server = new SoapServer(DIR_ROOT."/virtueleincasso.wsdl");
$server->setClass('PP_Api');
$server->handle();
die();

解决方案:我使用了一个 die 函数来停止返回空字符串的服务器函数。我通过将其更改为退出功能来修复它。

我在使用 soap 扩展的多个 PHP 进程时遇到了类似的问题。这似乎是处理 WSDL 缓存方式中的一个错误。我还尝试像您一样通过ini_set()电话禁用它,但没有成功。我最终在我的案例中找到了一个解决方法。我需要将cache_wsdl选项设置为 WSDL_CACHE_NONE .

return new SoapClient("http://localhost/virtueleincasso.wsdl", array(
    "exceptions" => 1,
    "cache_wsdl" => WSDL_CACHE_NONE
));