Laravel Artisan CLI安全地停止守护程序队列工作程序

Vig*_*igs 17 php queue daemon laravel artisan

为了处理大量的工作,我运行可变数量的队列工作者,具体取决于完成的工作量.我不想在完成我们认为合适的时间段内完成需要完成的工作之外运行更多的工人.

目前,我启动了5个守护程序队列工作程序用于测试目的,但是在生产中,这个数字可能介于25到100名工作人员之间,可能更多.我知道在部署时,我必须首先通过使用框架将框架置于维护模式来停止队列工作php artisan down,因为该--daemon标志导致框架仅在工作程序启动时加载,因此新代码在部署期间不会生效工人重新开始.

如果由于某种原因我需要停止工作,我可以将应用程序置于维护模式,php artisan down这将导致工作人员在完成当前工作(如果他们正在工作)之后死亡.但是,有时我可能会在不将整个应用程序置于维护模式的情况下杀死工作人员.

有没有一种安全的方法来阻止工人继续处理他们当前的工作,然后在不将整个应用程序置于维护模式的情况下死亡?

基本上我需要的是一个php artisan queue:stop,表现得像php artisan queue:restart,但一旦完成工作就不会重启工人.

我在那里期待有一个类似的php artisan queue:stop命令可以做到这一点,但似乎并非如此.

使用ps aux | grep php我能够为工作者获取进程ID,并且我可以通过这种方式终止进程,但我不想在处理作业的过程中终止进程.

谢谢.

Dei*_*ite 6

使用--daemon标志时,当队列为空时,工作人员不应退出。

我认为您正在寻找的是队列文档中的内容。

php artisan queue:restart命令将提示工作人员在完成当前工作后重新启动。

  • 使用 `php artisan queue:work --daemon` 打开终端并在另一个终端中运行 `php artisan queue:restart`。第一个终端实际上​​会在一段时间后关闭。它实际上并没有重新启动它,这取决于像 http://supervisord.org/ 这样的单独进程来处理。 (10认同)
  • 正确,我不希望工作人员在队列为空时停止。我想要做的是按命令停止队列工作人员,但要“安全”地进行,这样他们就不会在处理工作的过程中停止。`php artisan queue:restart`,不幸的是没有做我需要它做的事情。我不希望重新启动工人,我希望“安全地”阻止他们。该文档不包含有关停止队列工作器的任何信息,它只是提到您可能必须“手动”执行此操作。 (2认同)

Nik*_*kko 6

我们已经在我们的应用程序中实现了类似的东西 - 但它不是 Laravel 本身内置的东西。您必须通过向 if 块添加另一个条件来编辑此文件,以便它调用该stop函数。您可以通过在Worker类中设置一个静态变量来完成此操作,该变量在您运行必须执行的自定义命令时会发生更改(即php artisan queue:pause)或通过检查某处的原子值(即,将其设置在某些缓存中,例如 redis、memcached 、APC 或什至 MySQL,尽管这意味着对于使用相同自定义命令设置的此 while 循环的每个循环,您将有一个 MySQL 查询。