Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解析巨大的XML—记住上次成功处理的节点,以便在下次运行时设置偏移量_Php_Xml_Xmlreader - Fatal编程技术网

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

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文件,用于计划导入。我使用cron来解析它们。 问题是处理时间太长,总是超过php的“最大执行时间”。因为我使用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运行设置偏移量?

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

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

  • 第一个cron将解析XML并将新任务转储到一堆中
  • 第二个cron将从堆中获取工作,对其进行处理,然后将其从堆中移除
  • 桩可以通过几种方式实施,其中包括:

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


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

    通常php cli不会设置最长的执行时间。谢谢您的回答。这是一个显而易见的解决方案,我已经考虑过了。然而,“补偿”的概念似乎更具吸引力。更新了我的答案,希望能给你更多信息。不过,怎么可能在cron中禁用最大执行时间呢?好的,这不是直接的答案,但至少我学会了关机功能:)谢谢!