【问题标题】:Laravel queue:restart is not killing workersLaravel 队列:重启不会杀死工人
【发布时间】:2017-07-04 01:11:06
【问题描述】:

我有一个通过 envoyer 部署到非伪造服务器的 laravel 5.4 应用程序。我正在数据库驱动程序上运行队列工作程序,使用主管进行监控,按照文档中的说明进行设置;

command=php /home/data/app/current/artisan queue:work --sleep=3 --tries=3

并使用 envoyer 部署钩子

cd ~/app/current
php artisan queue:restart

问题是,每次部署后,队列工作程序都没有重新启动,旧的工作程序继续运行,然后抛出错误,因为它们正在处理以前版本的代码。从 CLI 手动运行 queue:restart 也不起作用。

data@medicone:~/ccpbase/current$ ps -aux | grep queue:work
data      4347  0.0  0.2 292988 34852 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4348  0.0  0.2 292988 34864 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4349  0.0  0.2 292988 34720 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4350  0.0  0.2 292988 34880 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4351  0.0  0.2 292988 34972 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4382  0.0  0.2 292988 34904 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4383  0.0  0.2 292988 34992 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4384  0.0  0.2 292988 34980 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4863  0.0  0.0  14228  1016 pts/0    S+   11:32   0:00 grep queue:work
data@medicone:~/ccpbase/current$
data@medicone:~/ccpbase/current$ php artisan queue:restart
Broadcasting queue restart signal.
data@medicone:~/ccpbase/current$ ps -aux | grep queue:work
data      4347  0.0  0.2 292988 34852 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4348  0.0  0.2 292988 34864 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4349  0.0  0.2 292988 34720 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4350  0.0  0.2 292988 34880 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4351  0.0  0.2 292988 34972 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4382  0.0  0.2 292988 34904 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4383  0.0  0.2 292988 34992 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4384  0.0  0.2 292988 34980 ?        S    11:12   0:00 php /home/data/ccpbase/current/artisan queue:work --sleep=3 --tries=3
data      4869  0.0  0.0  14228   960 pts/0    S+   11:32   0:00 grep queue:work
data@medicone:~/ccpbase/current$

如果我手动找到并终止 8 个正在运行的进程,主管会正确地重新启动它们,并且我的排队作业会再次运行。

有人能想出什么可以阻止这些工人被杀吗? storage/logs/laravel.log 中没有相关内容

【问题讨论】:

  • 尝试重启 Supervisor。
  • queue:restart 通过将某些内容发布到缓存键来工作,工作人员在完成工作并决定是否开始新工作时会注意到这一点。这不是立即的事情,当前的工作需要先完成。如果您的作业长时间运行,那么它看起来好像它们没有重新启动。如果您想立即重启,请改用supervisorctl
  • 你使用的是哪个缓存后端/
  • @georgexsh 我用的是redis,但后来我升级了所有东西,现在使用horizo​​n,不再有这个问题

标签: php laravel laravel-artisan laravel-queue


【解决方案1】:

了解与以下队列相关的几点很重要:重启命令

php artisan queue:restart
  • 此命令将指示所有队列工作人员在完成当前作业处理后优雅地“死亡”,以免丢失现有作业。
  • 队列使用缓存来存储重启信号,因此在使用此功能之前,您应该验证是否为您的应用程序正确配置了缓存驱动程序。
  • 由于队列工作人员会在执行 queue:restart 命令时死掉,因此您应该运行一个进程管理器(例如 Supervisor)来自动重新启动队列工作人员。

这意味着 queue:restart 不会立即重新启动队列,而只是“广播队列重新启动信号”让队列工作人员在完成当前分配的任务后使其死亡。

参考:https://laravel.com/docs/5.6/queues#queue-workers-and-deployment

【讨论】:

    【解决方案2】:

    在我的情况下,php artisan queue:restart 也没有做任何事情。排队工作人员的年龄证实他们没有为此重新启动。以下将显示您的工作人员何时启动。我的都不同了,好几天了。

    $ ps -eo pid,lstart,cmd | grep queue:work
    

    作为我的部署脚本(在我的例子中是 gitlab)的一部分,我正在运行 php artisan queue:restart,因此队列工作人员在任何代码被实时推送后重新启动。

    如上一个答案所述,queue:restart 命令保存到 Laravel 缓存中。我正在使用“文件”缓存驱动程序,因此缓存条目默认位于磁盘上的storage/framework/cache/data

    事实证明,我的部署脚本以 gitlab-runner 用户身份运行 php artisan queue:restart,因此它创建的任何缓存条目也归该用户所有。

    运行以下命令立即解决了我的问题。队列工作人员在运行时重新启动:

    sudo chown -R www-data:www-data storage/framework/cache
    

    此后,php artisan queue:restart 的命令行调用完美运行。

    长期解决方案是确保我的部署脚本以正确的用户身份运行 php artisan queue:restart(或 chown 根据需要运行缓存文件)。

    tldr;如果使用“文件”缓存驱动程序,您的 Web 服务器用户需要能够读取/写入由php artisan queue:restart 命令创建的缓存条目。检查您的权限!

    【讨论】:

      猜你喜欢
      • 2018-01-14
      • 2021-01-05
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2021-02-01
      相关资源
      最近更新 更多