我遇到了一个奇怪的问题。在我的代码下面:
$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);
}
}