【问题标题】:Is multi-threading possible in laravel 5.5?laravel 5.5 中可以多线程吗?
【发布时间】:2019-02-11 06:19:31
【问题描述】:

我是 laravel 和 php 的新手。我正在解决将大数据插入数据库的问题,这需要很多时间。所以我在考虑将数据分成块并创建多个线程来插入这些数据块。我正在使用 php 7.2.4 和我的 laravel 5.5。 这是我的代码:

$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);

【问题讨论】:

  • 假设您有 1000 GB 要上传,有 10 台计算机并为每台分配 100 GB 来上传。这也取决于您的服务器带宽需要多少时间
  • 实际上我正在上传一个 csv 文件,并在过滤 csv 中的记录后将其插入数据库。它不是一个很大的文件,它包含 500 万条记录。 csv的解析和过滤不需要太多时间,唯一的问题是数据插入。
  • 文件读取需要时间。

标签: php multithreading laravel apache wamp


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我正在将一列 csv 文件上传到服务器,其中包含 500 万条记录。过滤掉在数据库中插入记录数组的记录后。
猜你喜欢
  • 2013-03-08
  • 2020-02-19
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多