我有一些非常大的xml文件用于计划导入。我用cron来解析它们。 问题是处理花费太多时间并且总是超过php“max_execution_time”。由于我使用XMLReader,它允许逐行读取xml,这是我看到的唯一解决方案:跟踪当前工作“节点”,记住它并在下一次运行时设置节点偏移。
现在我有了
$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运行设置偏移量?
答案 0 :(得分:2)
首先,当您从cron执行php时,通常使用默认max_execution_time为0(禁用)的cli版本。如果你无法改变,继续阅读。
如果您的XML可以在一段时间内解析(仅解析,不处理),您可以有两个crons:
堆可以通过几种方式实现,其中包括:
修改强>
如果无法禁用执行时间限制,则可以保留包含文件名和位置的小文件。在每次迭代时,您都可以打开此文件以确定是否仍有工作要做。要确保在时间用完时保存该文件,您需要注册shutdown function。