我遇到了一个奇怪的问题。在我的代码下面:
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
预先感谢
尼尔斯
答案 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);
}
}