Php 解析巨大的XML—记住上次成功处理的节点,以便在下次运行时设置偏移量
我有一些相当大的xml文件,用于计划导入。我使用cron来解析它们。 问题是处理时间太长,总是超过php的“最大执行时间”。因为我使用XMLReader,它允许“逐行”读取xml,我看到的唯一解决方案是:跟踪当前工作的“节点”,记住它并在下一次cron运行时设置节点偏移量 现在我有Php 解析巨大的XML—记住上次成功处理的节点,以便在下次运行时设置偏移量,php,xml,xmlreader,Php,Xml,Xmlreader,我有一些相当大的xml文件,用于计划导入。我使用cron来解析它们。 问题是处理时间太长,总是超过php的“最大执行时间”。因为我使用XMLReader,它允许“逐行”读取xml,我看到的唯一解决方案是:跟踪当前工作的“节点”,记住它并在下一次cron运行时设置节点偏移量 现在我有 $xml = new XMLReader; $xml->open($file); $pointer = 0; while($xml->read()) { if ($xml-&g
$xml = new XMLReader;
$xml->open($file);
$pointer = 0;
while($xml->read()) {
if ($xml->nodeType == XMLReader::ELEMENT && $xml->localName == 'Product') {
$chunk = array();
$chunk['ProductID'] = $xml->getAttribute('ProductID');
$chunk['ProductName'] = $xml->getAttribute('ProductName');
process_import($chunk); // Process received date
save_current_node_in_BD($pointer++); // insert current position in BD
}
}
$xml->close();
}
使用$pointer++计算已处理的节点数是一个好主意吗?
如何为下一次cron运行设置偏移量?首先,当您从cron执行php时,通常使用默认最大执行时间为0(禁用)的cli版本。如果你不能改变,继续阅读 如果您的XML可以在一段时间内解析(仅解析,不处理),那么您可以有两个cron:
- 数据库表
- 工作项目录(每个工作项是一个文件)
如果不能禁用执行时间限制,可以保留一个包含文件名和位置的小文件。在每次迭代中,您可以打开此文件以确定是否还有工作要做。为了确保在时间用完时保存该文件,您需要注册一个。通常php cli不会设置最长的执行时间。谢谢您的回答。这是一个显而易见的解决方案,我已经考虑过了。然而,“补偿”的概念似乎更具吸引力。更新了我的答案,希望能给你更多信息。不过,怎么可能在cron中禁用最大执行时间呢?好的,这不是直接的答案,但至少我学会了关机功能:)谢谢!