0

我有一些用于计划导入的相当大的 xml 文件。我使用 cron 来解析它们。问题是处理需要太多时间并且总是超过 php“max_execution_time”。由于我使用 XMLReader,它允许“逐行”读取 xml,我看到的唯一一个解决方案是:跟踪当前工作的“节点”,记住它并在下一次 cron 运行时设置节点偏移量。

我现在有

  $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 运行设置偏移量?

4

1 回答 1

2

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

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

  1. 第一个 cron 将解析 XML 并将新任务转储到一堆。
  2. 第二个 cron 将从堆中取出工作,对其进行处理,然后将其从堆中移除。

桩可以通过几种方式实现,其中:

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

编辑

如果您不能禁用执行时间限制,您可以保留一个包含文件名和位置的小文件。在每次迭代中,您都可以打开此文件以确定是否还有工作要做。为了确保它在时间用完时保存该文件,您需要注册一个关闭功能

于 2012-05-14T03:56:33.783 回答