php - 使用 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]
);
}
解决方案
最简单但不优雅的解决方案是使用偏移量多次调用脚本并使用 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 调用,该调用将使用下一个偏移量调用自身,而无需等待答案。
推荐阅读
- batch-file - 在cmd/batch中逐个字符循环字符串?
- angular - 带有粘性和自定义宽度列的角材料表
- php - laravel 与关系回调函数并加入它
- vb.net - IsNumeric 语句和范围
- python - 如何切片具有“无”维度的张量?
- excel - 基于部分字符串的 SUMIF
- qt - QT QPainter 在 QPixmap 上绘制,坐标在像素图之外
- javascript - JS Regex 仅用于第一个字母,但如果只有两个字母的单词保持两个 AND 数字不变
- continuous-integration - 如何重试失败的测试?
- php - 请帮助:如果 isset 在上传多个文件时不起作用