解析巨大的XML - 记住上次成功处理的节点,以便在下次运行时设置偏移量

时间:2012-05-14 03:40:51

标签: php xml xmlreader

我有一些非常大的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运行设置偏移量?

1 个答案:

答案 0 :(得分:2)

首先,当您从cron执行php时,通常使用默认max_execution_time为0(禁用)的cli版本。如果你无法改变,继续阅读。

如果您的XML可以在一段时间内解析(仅解析,不处理),您可以有两个crons:

  1. 第一个cron将解析XML并将新任务转储到堆上。
  2. 第二个cron将从堆中取出工作,处理它然后将其从堆中移除。
  3. 堆可以通过几种方式实现,其中包括:

    • 数据库表
    • 工作项目录(每个工作项目是一个文件)

    修改

    如果无法禁用执行时间限制,则可以保留包含文件名和位置的小文件。在每次迭代时,您都可以打开此文件以确定是否仍有工作要做。要确保在时间用完时保存该文件,您需要注册shutdown function