首页 > 解决方案 > 使用 PHP/Laravel 批量解析多个 XML 文件

问题描述

我的代码已经在工作了,它会解析文件并插入记录,因为我从来没有这样做过,所以困扰我的问题是,我怎么能告诉我的代码解析 1-300 个文件然后等待然后解析下一个“批处理”301-500 依此类推,直到完成所有文件的解析。我需要解析超过 5 万个文件,所以显然我已经达到了 php 的内存限制和已经增加的执行时间,但我认为我不能将它设置得非常高来处理 5 万个文件。

我需要有关如何告诉我的代码运行 1-x 然后重新运行并运行 xy 的帮助?

我的代码是(注意,我正在收集更多信息,这些信息在我下面的片段中)

$xml_files = glob(storage_path('path/to/*.xml'));

foreach ($xml_files as $file) {

$data = simplexml_load_file($file);

... Parse XML and get certain nodes ...
$name = $data->record->memberRole->member->name;

... SQL to insert record into DB ...
Members::firstOrCreate(
    ['name' =>  $name]
);

}

标签: phpxmllaravelmariadb

解决方案


最简单但不优雅的解决方案是使用偏移量多次调用脚本并使用 for 循环而不是 forach。

$xml_files = glob(storage_path('path/to/*.xml'));
$offset = $_GET['offset'];
// Or if calling the script via command line:
// $offset = $argv[1];
$limit = $offset + 300;

for ($i = $offset; $i < $limit; $i++) {
    $data = simplexml_load_file($xml_files[$i]);
    // process and whatever
}

如果您将脚本作为网页调用,只需添加一个查询参数,my-xml-parser.php?offset=300并像这样获取偏移量:$offset = $_GET['offset'].

如果您将其作为命令行脚本调用,请像这样调用它:php my-xml-parser.php 300,并从 argv 获取偏移量:$offset = $argv[1]

编辑如果它是一个网络脚本,您可以尝试添加一个 curl 调用,该调用将使用下一个偏移量调用自身,而无需等待答案。


推荐阅读