laravel 5.5中是否可以进行多线程处理?

问题描述 投票:0回答:1

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

php multithreading laravel apache wamp
1个回答
1
投票

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

Laravel队列在各种不同的队列后端提供统一的API [...]。队列允许您推迟处理耗时的任务,例如发送电子邮件,直到稍后。推迟这些耗时的任务可以大大加快对您的应用程序的Web请求。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.