75

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

4

4 回答 4

140

编辑更新于 2017 年 4 月 7 日:

现在有三种方式来运行你的队列:

  • queue:work- 这是新的“守护进程”进程(不再需要该标志)。该框架将启动“一次” - 然后继续循环遍历作业。这将无限期地持续下去。它使用更少的内存/cpu,queue:listen因为框架一直保持运行状态。您还必须记住使用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

于 2014-09-25T23:30:20.030 回答
17

事情已经改变,但文件中没有提到

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

现在默认 php artisan queue:work以守护程序模式运行,

因此,queue:work无需重新启动框架即可继续处理作业

一旦命令运行它,

php artisan queue:work --once

于 2017-03-20T03:01:03.453 回答
5

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

亲自尝试:打开 2 个终端并work --daemon在一个和listen另一个中运行。该work窗口执行作业的速度将比listen.

于 2016-10-11T13:13:23.023 回答
1

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

根据文档

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

php artisan queue:work --stop-when-empty
于 2019-07-23T21:07:37.947 回答