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

p01*_*ath 9 php supervisord laravel laravel-5

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

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

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

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

p01*_*ath 5

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

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

然后,我可以将命令推送到为即时块创建的队列中,并使用--onceoption 仅对该队列执行一次队列工作器。为了易于理解,这是我正在使用的代码。

$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++;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的,我已经实现了一个系统,在该系统中我必须同时发出 50 个请求,并且我已经使用 supervisord 完成了这项工作。您必须为“--once”运行每个进程,并根据您的需要增加工作人员的数量,当然您必须考虑您的服务器能力。 (2认同)

Tah*_*aza 4

只是根据我的个人经验添加一些内容。

首先为您的操作系统相应地安装和配置管理程序,以下是基于 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
Run Code Online (Sandbox Code Playgroud)

然后根据您的需求创造就业机会并派遣

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