p01*_*ath 9 php supervisord laravel laravel-5
首先,我了解队列,现在对队列有很好的经验.队列的问题是,它是一个队列.我想在后台一起执行多个函数或命令.队列将第二个命令或函数保留在队列中,并在第一个命令或函数执行完毕后执行!
例如,我有一个包含约3,000,000条记录的表,我想更快地处理它们.我能做的是将它们分成5个相等的块并完全执行5个命令,这样我就可以利用我的CPU以及处理数据5倍的速度.
那么,我怎么能用Laravel做到这一点?队列不会起作用,因为它们一个接一个地执行.如果你的想法是创建多个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命令,我们正在为为特定块创建的特定队列执行队列工作器。另外,我们&在命令末尾添加了强制命令在操作系统级别在后台执行的功能。
这是可以做到的。我测试了它,它运行顺利!还有其他需要改进的地方,或者使用此方法是否有缺点?
只是根据我的个人经验添加一些内容。
首先为您的操作系统相应地安装和配置管理程序,以下是基于 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作业将同时处理。
| 归档时间: |
|
| 查看次数: |
2286 次 |
| 最近记录: |