Laravel队列:重启不会杀死工人

时间:2017-02-15 11:36:51

标签: php laravel artisan laravel-queue

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

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

并使用envoyer部署挂钩

cd ~/app/current
php artisan queue:restart

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

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个正在运行的进程,主管会正确重新启动它们,并且我的排队作业会再次运行。

有人可以想到任何可能阻止这些工人被杀的事吗?存储/日志/ laravel.log

中没有任何相关内容

2 个答案:

答案 0 :(得分:1)

重要的是要掌握与以下队列有关的几点:重新启动命令

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

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

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

答案 1 :(得分:0)

就我而言,php artisan queue:restart也什么也没做。队列工作人员的年龄确认他们没有因此而重启。以下内容将向您展示您的工人何时上岗。几天之后,我的一切都变了。

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

作为我的部署脚本(以我的情况为gitlab)的一部分,我正在运行php artisan queue:restart,因此在实时上推任何代码之后,队列工作器将重新启动。

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

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

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

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命令创建的缓存条目。检查您的权限!