【问题标题】:How to execute more than one background process in laravel?如何在 laravel 中执行多个后台进程?
【发布时间】:2018-08-05 20:29:19
【问题描述】:

首先,我知道队列,现在对队列有很好的经验。队列的问题是,它是一个队列。我想在后台一起执行多个功能或命令。队列会将第二个命令或函数保留在队列中,并在第一个命令或函数执行完毕后执行!

例如,我有一个包含约 3,000,000 条记录的表,我想更快地处理它们。我能做的就是将它们分成 5 个相等的块并一共执行 5 个命令,这样我就可以利用我的 CPU 以及将数据处理速度提高 5 倍。

那么,我如何使用 Laravel 做到这一点?队列不会工作,因为它们一个接一个地执行。如果您的想法是创建多个 5 多个队列和主管来完成,我认为这不是标准的方法。

关于在这种情况下可以做什么的任何想法?

【问题讨论】:

  • 添加更多 php 工作人员,并可能将您的队列拆分为重负载队列和快速队列,这样小作业就不必等待大作业了。
  • 这种方法值得一试:alfrednutile.info/posts/106
  • @DharmaSaputra,绝对!也许这就是我正在寻找的。​​span>
  • 我有同样的要求和同样的工作。
  • @Christophvh,我找到了解决方案并创建了答案。

标签: php laravel laravel-5 supervisord


【解决方案1】:

最后,我找到了解决方案。这是非常非常容易的。所以,这就是它的工作原理。

首先,我将记录划分为块的数量(例如,5 个块。它将 300 万个项目分成 5 个块,每个块有 60 万个项目)

然后,我可以将命令推送到我为块即时创建的队列,并使用--once 选项只为该队列执行一次队列工作程序。为了便于理解,这是我正在使用的代码。

$chunk_id = 0;
foreach($chunks as $chunk){
    // Adding chunk to queue
    Artisan::queue('process:items',[
        'items' => $chunk,
    ])->onQueue('processChunk'.$chunk_id);

    // Executing queue worker only once
    exec('php artisan queue:work --queue=processChunk'.$chunk_id.' --once > storage/logs/process.log &');

    $chunk_id++;
}

使用exec 命令,我们正在为为特定块创建的特定队列执行队列工作者。此外,我们还在命令末尾添加了&,这会强制命令在操作系统级别在后台执行。

这是可以做到的。我测试了它,它工作顺利!使用这种方法还有什么需要改进或有什么缺点吗?

【讨论】:

  • 为什么不使用 supervisord 与多个工人说numprocs=5
  • @TahirRaza,你确定它会同时执行多个队列作业吗?
  • 是的,我已经实现了一个系统,在该系统中我必须同时发出 50 个请求,并且我已经使用 supervisord 完成了这项工作。您必须为--once 运行每个进程,并根据您的需要增加工作人员的数量,当然您必须考虑您的服务器功能。
【解决方案2】:

只是根据我的个人经验补充一点。

相应地,您的操作系统的第一个 install and configure 主管,以下是基于 linux 的操作系统的配置文件,例如Ubuntu

主管配置文件:(/etc/supervisor/conf.d)

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work database --sleep=3 --tries=3
autostart=true
autorestart=true
user=username
numprocs=25
redirect_stderr=true
stderr_events_enabled=true
stderr_logfile=/var/www/app/storage/logs/worker.error.log
stdout_logfile=/var/www/app/storage/logs/worker.log

然后根据你的需要创建jobsdispatch

主管将同时处理作业,在这种特殊情况下,25 作业将同时处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多