我在使用 Laravel Eloquent 将大约 250k 条记录插入 MySQL 数据库时遇到 PHP 执行时间错误。考虑到以下限制,我的目标是在不增加总体执行时间的情况下实现这一目标:
下面是我的代码。
作业文件代码 -
class MedicineData implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Batchable;
public $data;
public function __construct($data)
{
$this->data = $data;
}
public function handle(): void
{
foreach ($this->data as $key => $value) {
$medicine = new MedicineName();
$medicine->name = $value['name'];
$medicine->save();
}
}
}
控制器文件代码
$chunks = array_chunk($data, 500);
$batch = Bus::batch([])->dispatch();
foreach ($chunks as $key => $value) {
$batch->add(new MedicineData($value));
}
我收到最大 PHP 执行时间错误。怎么解决这个问题。
就您而言,使用 Laravel 队列是朝着正确方向迈出的一步,但您可能需要调整您的方法以使其更加高效。您需要对队列逻辑进行一些优化:
public function handle(): void
{
$dataToInsert = [];
foreach ($this->data as $value) {
$dataToInsert[] = [
'name' => $value['name'],
// other attributes...
];
}
// use insert method to bulk inserting
MedicineName::insert($dataToInsert);
// If your $this->data already formated array than no need to run loop for formating
// use direct insert on Model
// MedicineName::insert($this->data);
}
insert 方法更适合批量插入,可以通过一次查询将多条记录插入数据库。