Laravel队列:工作正在消耗我所有的内存

Laravel队列:工作正在消耗我所有的内存,laravel,Laravel,我在Laravel 5.4中遇到了一个问题,我希望有人能帮助我。我有一个laravel 5.4项目,我使用queue发送电子邮件,并执行各种命令,如下所示: 1. Kernel.php protected function schedule(Schedule $schedule) { // $schedule->command('inspire') // ->hourly(); $schedule->command('queue:w

我在Laravel 5.4中遇到了一个问题,我希望有人能帮助我。我有一个laravel 5.4项目,我使用queue发送电子邮件,并执行各种命令,如下所示:

1. Kernel.php

protected function schedule(Schedule $schedule)
{
    // $schedule->command('inspire')
    //          ->hourly();

    $schedule->command('queue:work')->everyMinute();

    // Execute command at midnight daily to reject expired applications
    $schedule->command('application:reject')->daily();
}
  • 在/etc/crontab中,我得到了以下信息:
  • 
    *****bob cd/opt/lampp/htdocs/oap/&/usr/local/bin/php artisan计划:运行>>/dev/null 2>&1
    *****bob cd/opt/lampp/htdocs/ims/&/usr/local/bin/php artisan计划:运行>>/dev/null 2>&1
    

    当我查看linux系统监视器时,我注意到每分钟都会启动一个新的php进程,占用13.8MB的内存。大约一个小时后,我开始发现我的空闲内存很低。这些过程是
    /opt/lampp/bin/php-7.1.4 artisan queue:work
    /usr/local/bin/php artisan schedule:run

    当发生上述情况时,我将运行
    artisan queue:restart
    ,所有php进程都将被终止

    这可能是什么原因


    这对我来说很奇怪,因为我在Laravel5.1中有相同的代码,我没有经历过这种情况。我能做些什么来解决这个问题呢?

    您的问题是您正在用代码调度一些命令

    代码中的某种调度每分钟都在调度。(:

    在5.1中,它之所以能够工作是因为有两个命令:
    queue:listen
    可以长时间工作,而
    queue:work
    可以一直工作到队列为空

    似乎laravel团队要删除
    queue:listen

    这就是解决方案:

    1) 只需从
    Kernel.php
    中删除您的代码,并将其安排为正常的artisan调用:

    # daily
    0 0 * * * bob cd /opt/lampp/htdocs/ims/ && /usr/local/bin/php artisan application:reject >> /dev/null 2>&1
    
    2) 手动运行或监督
    队列:与主管一起工作

    cd /opt/lampp/htdocs/oap/ && nohup php artisan queue:work &
    

    队列工作者是一个守护进程,它将保持轮询。停止使用cron运行队列工作程序。它们是长期存在的进程,您可以根据服务器上的需求运行worker,而不是每分钟生成一个新的worker


    阅读文档。如果您不太熟悉,那么只需安装
    Supervisor
    ,让它处理所有工作。

    请咨询:
    ps-ax | grep artisan
    如果有许多流程,那么请使用Supervisor Hi@num8er。有很多过程。好的,我现在正在写答案。这是简单的答案。切勿在cron中运行队列工作程序。创建一个安装程序,以便在启动服务器时运行一个或多个辅助进程。确保他们死后重生,否则你的队列将无法处理。因此,为了简化所有这些,有
    主管
    。嗨@sandesh。谢谢你的意见。我正在配置一个监管者,请阅读答案中链接的文档。
    queue:work
    命令生成一个工作进程,这是一个长寿命的进程。即使他将日程改为每天,他也会在2个月内有60名员工,在3个月内有90名员工。队列工作人员不应该这样运行,除非你想无缘无故地继续繁殖工作人员并占用你的内存。@Sandeesh我知道,我正在重写我的答案。我原以为还有
    queue:listen
    和以前一样,但现在好像变了。这是两个不同的命令<代码>队列:侦听-侦听给定的队列
    队列:工作-开始作为守护进程处理队列上的作业
    。我刚在本地的laravel安装中检查过。出于某种原因,他们从文档中删除了它,这很奇怪。嗨,num8er,谢谢你的解释。我现在明白为什么在5.1中工作了。我已经实施了@Sandeesh提议的主管,并且正在运行