在laravel 5.5中可以使用多线程吗?

时间:2018-09-06 04:10:39

标签: php multithreading laravel apache wamp

我是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);

1 个答案:

答案 0 :(得分:1)

您可以利用Laravel队列。我引用Laravel's documentation

  

Laravel队列提供了跨各种不同队列后端的统一API [...]。队列使您可以将耗时的任务(如发送电子邮件)的处理推迟到以后。推迟执行这些耗时的任务,可以大大加快对您的应用程序的Web请求。

如果同时运行多个queue workers ,则可以实现某种“多线程”(我知道这不是同一件事,但是效果是相同的,并行处理中)

您可以创建一个Artisan命令,将导入批处理分成几个块,然后分派多个queue jobs,每个块一个。

您没有提到要导入的数据源,因此很难为实现提供更多具体细节,但是关键不是要向每个作业发送数据块,而是要为他们提供信息以自行从批次中提取数据。这样一来,您就不会在队列中存储大量数据,因为消息存储容量有限。

例如,假设您的数据来自文件,您的artisan命令可以读取文件中的行数,将其除以您要处理的每个块的记录数,然后创建带有参数的作业,该参数指示从文件处理的行。