SOAP客户端由于响应过大而产生内存错误



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

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

XML是这样的:

<columns code="..">
<column id="..">
<field>...</field>
<label>test</label>
<visible>true</visible>
<ask>false</ask>
<operator>none</operator>
<from></from>
<to></to>
<finderparam>...</finderparam>
</column>
</columns>

当我运行这个代码时,我得到了一个内存错误:

允许的内存大小134217728字节已用尽(试图分配65183479字节(

正如您所看到的,响应只有大约60MB。我以为SoapClient只是处理大块的事情?(数据较少的请求完美工作(

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

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

我使用的是php版本5.6和SOAP版本1.2

提前感谢

Niels

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

XML阅读器是一个所谓的"拉"解析器。这样做的好处是,您可以在不将整个填充加载到内存中的情况下开始解析(就像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);
}
}

相关内容

  • 没有找到相关文章

最新更新