我正在评估XmlStreamer类来处理潜在的大型XML文件。它适用于小文件,但是只要我用大型XML文件提供它就会占用所有系统内存并点击我设置的任何memory_limit
(即使我还没有编写代码来使用< / em>数据)。
据我所知,它遍历顶级节点(不包括根元素),并在完成阅读每个节点时调用processNode()
。回调函数接收带有节点的完整XML字符串的字符串,这似乎是访问数据的唯一方法。 (提供的示例建议使用SimpleXML
解析它。)一旦顶级节点包含几MB的数据,这种方法就会明显失败,就像我的情况一样。
因此,该类允许覆盖chunkCompleted()
«以提高性能»。这似乎正是我所需要的 - 但我无法弄清楚如何将它用于有用的东西。
该类定期调用chunkCompleted()
,但我无法弄清楚如何访问部分读取的数据。回调不接收参数,所有类属性都是私有的,没有我可以调用的方法。 example given在processNode()
填充自定义属性并从chunkCompleted()
读取它们但这是毫无意义的:在完成顶级节点处理并加载到内存之前,您将无法获得数据。拨打chunkCompleted()
的所有电话都不会执行任何操作,除了最后一次,在这种情况下,我可以直接在processNode()
完成我的工作。
此外,如果我减少块大小,类会开始丢失节点,这表明它不能处理不适合单个块的元素。
我错过了一些明显的东西,或者图书馆还没有准备就绪?
class FirstExample extends XmlStreamer{
public function processNode($xmlString, $elementName, $nodeIndex){
echo __METHOD__ . PHP_EOL;
var_dump($xmlString, $elementName, $nodeIndex);
}
public function chunkCompleted(){
echo __METHOD__ . PHP_EOL;
}
}
$xml = new FirstExample('/path/to/my.xml', 80);
if( $xml->parse() ){
echo 'OK' . PHP_EOL;
}else{
echo 'Error' . PHP_EOL;
}