我是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);
您可以利用Laravel队列。我引用Laravel's documentation的话
Laravel队列在各种不同的队列后端提供统一的API [...]。队列允许您推迟处理耗时的任务,例如发送电子邮件,直到稍后。推迟这些耗时的任务可以大大加快对您的应用程序的Web请求。
如果你同时运行多个queue workers你可以实现某种“多线程”(我知道不是一回事,但效果是一样的,并行处理)
您可以创建一个Artisan命令,该命令将导入批处理分成几个块,然后调度多个queue jobs,每个块一个。
您没有提到要导入的数据源,因此很难提供更具体的实现细节,但关键不是向每个作业发送数据块,而是向他们提供提取数据的信息从批次中自己。这样,您就不会在队列中存储大量数据,这会限制邮件存储容量。
例如,假设您的数据来自文件,您的artisan命令可以读取文件中的行数,将其除以您要处理的每个块的记录数,并创建一个带有参数的作业,该参数指示要处理的行从文件。