queue:work --daemon和queue:listen之间有什么区别

时间:2014-09-25 21:48:19

标签: laravel laravel-4 laravel-5

我已设置我的离线作业服务器。我已经阅读了文档,但我仍然没有真正看到两个命令之间的差异:artisan queue:work --daemonartisan queue:listen。我应该使用哪个命令来运行守护进程?

4 个答案:

答案 0 :(得分:111)

修改更新的2017-04-07:

现在有三种方法可以运行你的队列:

  • queue:work - 这是新的"守护进程"进程(不再需要该标志)。框架将启动"一次" - 然后继续循环工作。这将无限期地继续下去。它比queue:listen使用更少的内存/ CPU,因为框架在整个时间内保持不变。您还必须记住使用queue:restart强制队列更新您在修补期间推送的任何代码更改。

  • queue:work --once - 这将激活框架,处理一个作业,然后关闭。适用于开发期间的测试等。

  • queue:listen - 这将在每个周期启动框架,处理一个作业,然后完全关闭,然后再次启动框架等并无限循环。这意味着在处理每个作业后释放所有内存/进程。如果您有queue:work的内存泄漏 - 请尝试一下。

--daemon标志不再对这些命令产生影响。

原始回答:

列出了两个不同的问题。

artisan queue:workartisan queue:listen

  • queue:work将弹出队列中的下一个作业,并仅处理该作业。这是一个关闭'处理完一个队列命令后将返回命令提示符的命令。
  • queue:listen将侦听队列,并继续处理它收到的任何队列命令。这将继续无限期地运行,直到你停止它为止。

在Laravel> = 4.2中添加了--daemon命令。它的工作方式只是直接运行队列,而不是在处理完每个队列后重新启动整个框架。这是一个可选命令,显着减少了队列的内存和CPU要求。

--daemon命令的重点是,当您升级应用程序时,需要使用queue:restart专门重新启动队列,否则您可能会遇到各种奇怪的错误,因为您的队列会仍然在内存中有旧代码。

所以回答你的问题" 我应该使用哪个命令来运行守护进程?" - 答案几乎总是queue:work --daemon

答案 1 :(得分:15)

Things have been changed 但文档中未提及

 --daemon  Run the worker in daemon mode (Deprecated)

现在默认情况下 php artisan queue:work以守护进程模式运行,

所以queue:work继续处理作业而无需重新启动框架

运行一次命令,

php artisan queue:work --once

答案 2 :(得分:4)

最重要的区别是queue:work --daemon不会在每个作业上重新启动框架,但queue:listen 。事实上,listen为每项工作启动了一个全新的Laravel流程。

亲自尝试:打开2个终端并在一个终端中运行work --daemon,在另一个终端中运行listenwork窗口将比listen快得多地执行作业。

答案 3 :(得分:0)

从Laravel 5.7开始,新的选项--stop-when-empty已添加到queue:work命令中。使用此选项时,当前队列将被处理直到其为空,然后命令将退出。

根据documentation

  

--stop-when-empty选项可用于指示工作程序处理所有作业,然后正常退出。如果您希望在队列为空后关闭该容器,请在Docker容器中处理Laravel队列时使用此选项:

php artisan queue:work --stop-when-empty
相关问题