我是laravel和php的新手。我正在研究将大量数据插入数据库的问题,这需要很多时间。因此,我正在考虑将数据划分为多个块,并创建多个线程以插入这些数据块。我正在使用php 7.2.4和laravel 5.5。
这是我的代码。
here is my code:
$row = 1;
$contactNumberList = [];
if (($handle = fopen($path . "/" . $fileName . "." . $fileExt ."", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$row++;
$contact_number = $this->filter_contact($data[0]);
if($contact_number != null){
$contactNumberList[] = ['contact_number' => $contact_number];
}
}
fclose($handle);
}
//insert records
\DB::table('contacts_'. $list_id)->insert($contactNumberList);
答案 0 :(得分:1)
您可以利用Laravel队列。我引用Laravel's documentation
Laravel队列提供了跨各种不同队列后端的统一API [...]。队列使您可以将耗时的任务(如发送电子邮件)的处理推迟到以后。推迟执行这些耗时的任务,可以大大加快对您的应用程序的Web请求。
如果同时运行多个queue workers ,则可以实现某种“多线程”(我知道这不是同一件事,但是效果是相同的,并行处理中)
您可以创建一个Artisan命令,将导入批处理分成几个块,然后分派多个queue jobs,每个块一个。
您没有提到要导入的数据源,因此很难为实现提供更多具体细节,但是关键不是要向每个作业发送数据块,而是要为他们提供信息以自行从批次中提取数据。这样一来,您就不会在队列中存储大量数据,因为消息存储容量有限。
例如,假设您的数据来自文件,您的artisan命令可以读取文件中的行数,将其除以您要处理的每个块的记录数,然后创建带有参数的作业,该参数指示从文件处理的行。