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


70

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

Answers:


131

编辑更新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


如何在后台运行守护程序?我应该在哪里放置代码以重新启动队列?
2015年

2
如果使用--daemon标志运行,则需要认真对待文档中的内存警告。如果您正在处理大文件或执行其他占用大量内存的工作,则该过程可能会泄漏至少一些内存,并最终崩溃。我什至尝试在这些作业中释放内存,但收效甚微。最好使用Supervisor生成新的Queue :: work流程。
ShaunUK

1
我仍然不知道queue:listen和queue:work --daemon之间有什么区别。queue:listen无限期运行,queue:work --daemon也无限期运行而无需重新加载框架,所以有什么区别?
Armen Markossyan '16

似乎工作和聆听几乎是同一回事,但背后有一些区别。您如何处理队列,然后不侦听更多事件而退出?
卢卡斯(Lucas)

1
@Lucas-是的,正确。您要么处理一项工作然后退出,要么无限期地处理。两者之间没有。
劳伦斯

16

情况已更改,但文档中未提及

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

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

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

一旦命令运行

php artisan queue:work --once


5

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

自己尝试:打开2个终端,然后work --daemon在另一个listen中运行。该work窗口将速度远远超过执行作业listen


0

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

根据文档

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

php artisan queue:work --stop-when-empty
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.