首先,我了解队列,现在对队列有很好的经验。队列的问题是,它是一个队列。我想在后台一起执行多个函数或命令。队列将第二个命令或函数保留在队列中,并在第一个命令或函数执行完毕后执行!
例如,我有一个包含约3,000,000条记录的表,我想更快地处理它们。我能做的是将它们分成5个相等的块并完全执行5个命令,这样我就可以利用我的CPU以及处理数据5倍的速度。
那么,我怎么能用Laravel做到这一点?队列不会起作用,因为它们一个接一个地执行。如果你的想法是创建多个5个多个队列和主管来完成,那我觉得这不是一个标准的方法。
关于在这种情况下可以做些什么的任何想法?
只是为了增加个人经验。
首先是针对您的操作系统的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工作将一次处理。
最后,我找到了解决方案。这非常容易。所以,这是它的工作原理。
首先,我将记录划分为块的数量(例如,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级别的后台执行。
这是如何做到的。我测试了它,它工作顺利!还有什么需要改进或使用这种方法有什么缺点吗?