PHPSOAP-获取http头时出错-但仅适用于许多调用中的少数调用

PHPSOAP-获取http头时出错-但仅适用于许多调用中的少数调用,php,soap,Php,Soap,我们在一个项目上切换服务器,该项目在一行中从客户机到服务器建立了18个soap连接。在旧服务器上,我们对此没有问题,但在新服务器上,总是一个特定的调用导致获取http头时出现错误错误,有时另一个调用也会以同样的方式失败。其他电话都很好 所有通话遵循完全相同的原则: 数据收集并存储在一个数组中(这是这些调用的唯一区别——提交的数据) 数组编码为json json字符串被添加到ZIP文件中 ZIP文件的内容使用openssl加密 加密字符串是base64编码的 编码的字符串被发送到服务器 在18个电

我们在一个项目上切换服务器,该项目在一行中从客户机到服务器建立了18个soap连接。在旧服务器上,我们对此没有问题,但在新服务器上,总是一个特定的调用导致获取http头时出现
错误
错误,有时另一个调用也会以同样的方式失败。其他电话都很好

所有通话遵循完全相同的原则:

  • 数据收集并存储在一个数组中(这是这些调用的唯一区别——提交的数据)
  • 数组编码为json
  • json字符串被添加到ZIP文件中
  • ZIP文件的内容使用openssl加密
  • 加密字符串是base64编码的
  • 编码的字符串被发送到服务器
  • 在18个电话中,只有同一个失败了——第17个——而且每次都失败了。有时,另一个会失败

    在测试过程中,这些调用中的每一个调用的数据基本相同-数组中的一个参数不同,并且为失败的调用向数组中添加了另外两个键

    我研究过StayaLife(在客户端禁用它也会导致第二次调用失败),我研究过切断连接(如本文所述:),我尝试过更改超时,但每次调用(包括失败的调用)的响应通常不到半秒

    以下是客户端代码:

    $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
    ));