如何在laravel中执行多个后台进程?

How to execute more than one background process in laravel?

首先,我了解队列并且现在对队列有很好的体验。队列的问题是,它是一个队列。我想在后台同时执行多个功能或命令。队列会将第二个命令或函数保留在队列中,并在第一个完成执行后执行!

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

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

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

终于找到了解决办法。这非常非常容易。所以,这是它的工作原理。

首先,我把记录​​分成chunk的个数(比如5个chunk。它会把300万条item分成5个chunk,每个chunk有600k条)

然后,我可以将命令推送到我为块即时创建的队列,并使用 --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 命令,我们正在为特定块创建的特定队列执行队列工作程序。此外,我们在命令末尾添加了 &,强制命令在后台以 OS 级别执行。

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

根据我的个人经历补充一些内容。

第一个 install and configure 您的 OS 主管相应地,以下是 linux 基于 OS 的配置,例如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

然后创建jobs according to your needs and dispatch.

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