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

问题描述 投票:9回答:2

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

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

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

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

php laravel laravel-5 supervisord supervisor
2个回答
3
投票

只是为了增加个人经验。

首先是针对您的操作系统的qazxsw poi主管,以下是基于Linux的操作系统的配置文件,例如: Ubuntu的

主管confs:(/ etc / supervisor / conf.d)

install and configure

然后根据您的需要和[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

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


4
投票

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

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

然后,我可以将命令推送到我为块快速创建的队列,并使用25选项仅对该队列执行一次队列工作。为了使它易于理解,这是我正在使用的代码。

--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级别的后台执行。

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

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