SOAP客户端通过大响应产生内存错误

时间:2018-12-05 17:41:48

标签: php web-services soap out-of-memory

我遇到了一个奇怪的问题。在我的代码下面:

PS> 'PPOnly', 'OnlyApp', 'PPandApp', 'Neither' -cmatch 'PP'
PPOnly
PPandApp

XML是这样的:

$response = $client->__soapCall('ProcessXmlString', [['xmlRequest' => $xml]]);

运行此代码时,出现内存错误:

已允许用完134217728字节的内存(尝试分配65183479字节)...

如您所见,响应仅为60MB。我以为SoapClient只是分块处理? (要求较少数据的请求效果很好)

我不想设置更高的内存限制,但希望部分地处理响应。

我真的不明白为什么会发生此错误。有人有想法/解决方案吗?

我正在使用php版本5.6和SOAP版本1.2

预先感谢

尼尔斯

1 个答案:

答案 0 :(得分:0)

我的建议是对大型(大于10mb)的XML文件使用XMLREADER。

XML Reader是所谓的拉式解析器。这样做的好处是您可以开始解析而无需将整个填充加载到内存中(就像SimpleXML或DOMDocument一样)。

一旦到达所需的级别/节点,请将xml的该部分传递给simpleXML。

一个例子:

<?php
$xml = new XMLReader;
$xml->open('example.xml');


$searchfor='Customer'; //nodename you're intending to find


while ($xml->read()){
    $nodename=$xml->localName;
    if ($nodename==$searchfor &&  $xml->nodeType == XMLReader::ELEMENT){ // does nodename match what we're looking for AND is it of type start elemenet (<example> but not </example>)

        ECHO '<hr>============= NODE FOUND ===================<br>';


        // Option 1
        //convert that into array so we can proceed with plain PHP
        $doc = new DOMDocument('1.0', 'UTF-8');
        $temp = simplexml_import_dom($doc->importNode($xml->expand(),true));
        $array = json_decode( json_encode($temp) , 1);


        echo "<pre>";
            print_r($array);
        echo "</pre>";


        // Option 2 Put current NODE contents into simpleXML object
        // $nodecontent = simplexml_load_string($xml->readOuterXML());
        // var_dump($nodecontent);

    }

}