如何在Laravel执行多个背景过程



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

例如,我有一个带有约3,000,000个记录的表,我想更快地处理它们。我能做的就是将它们分为5个相等的块,并完全执行5个命令,以便我可以使用我的CPU以及处理数据更快。

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

在这种情况下可以做什么?

最后,我找到了一个解决方案。这非常容易。因此,这是它的工作原理。

首先,我将记录划分为块数量(例如,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命令,我们正在执行为特定块创建的特定队列执行队列工作。另外,我们在命令的末尾添加了&,迫使命令在OS级别的后台执行。

这就是可以做到的。我测试了它,它运行顺利!还有其他需要改进的方法,或者有任何使用此方法的缺点?

只是为了添加我的个人经验。

首先安装和配置您的操作系统主管,以下是Linux Basaed OS的confs,例如ubuntu

主管confs :(/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

然后根据您的需求创建作业和调度。

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

最新更新