Laravel queue:work--daemon和queue:listen之间的区别是什么
我正在设置脱机作业服务器。我已经阅读了文档,但仍然没有真正看到这两个命令之间的区别:Laravel queue:work--daemon和queue:listen之间的区别是什么,laravel,laravel-4,laravel-5,Laravel,Laravel 4,Laravel 5,我正在设置脱机作业服务器。我已经阅读了文档,但仍然没有真正看到这两个命令之间的区别:artisanqueue:work--daemon和artisanqueue:listen。我应该使用哪个命令来运行我的守护进程?编辑更新2017-04-07: 现在有三种方法可以运行队列: 队列:工作-这是新的“守护进程”进程(不再需要该标志)。该框架将“一次”启动,然后继续在作业中循环。这将无限期地继续下去。它比queue:listen使用更少的内存/cpu,因为框架在整个时间内都保持不动。您还必须记住使用
artisanqueue:work--daemon
和artisanqueue:listen
。我应该使用哪个命令来运行我的守护进程?编辑更新2017-04-07:
现在有三种方法可以运行队列:
-这是新的“守护进程”进程(不再需要该标志)。该框架将“一次”启动,然后继续在作业中循环。这将无限期地继续下去。它比queue:listen使用更少的内存/cpu,因为框架在整个时间内都保持不动。您还必须记住使用队列:工作
强制队列更新您在修补过程中推送的任何代码更改queue:restart
——这将启动框架,处理一个作业,然后关闭。用于在开发等过程中进行测试队列:工作——一旦
-这将在每个周期启动框架,处理一个作业,然后完全关闭,然后再次启动框架等并无限期循环。这意味着在处理每个作业后,所有内存/进程都将被释放。如果queue:listen
队列:工作
出现内存泄漏,请尝试一下
--daemon
标志不再对这些命令有效
原始答案:
列出了两个不同的问题
有artisan队列:工作
和artisan队列:侦听
将直接弹出队列中的下一个作业,并仅处理该作业。这是一个“一次性”命令,处理完“一个队列”命令后将返回命令提示符queue:work
将侦听队列,并继续处理它接收到的任何队列命令。这将无限期地继续运行,直到您停止它queue:listen
--daemon
命令。它的工作方式就是直接运行队列,而不是在处理每个队列后重新启动整个框架。这是一个可选命令,可显著降低队列的内存和cpu需求
--daemon
命令的要点是,当您升级应用程序时,您需要特别使用队列:restart
重新启动队列,否则您可能会收到各种奇怪的错误,因为您的队列内存中仍然有旧代码
因此,要回答您的问题“我应该使用哪个命令来运行我的守护进程?”——答案几乎总是
队列:工作-守护进程最重要的区别是队列:工作-守护进程
不会在每个作业上重新启动框架,但队列:侦听
会重新启动框架。事实上,listen
为每个作业启动一个全新的Laravel流程
自己尝试:打开两个终端,一个运行work--daemon
,另一个运行listen
。work
窗口执行作业的速度比listen
快得多,但文档中没有提到它
--daemon Run the worker in daemon mode (Deprecated)
现在默认情况下php artisan队列:工作
以守护程序模式运行
因此queue:work
在不重新启动框架的情况下继续处理作业
对于一次运行命令
php artisan队列:工作--once
从Laravel 5.7开始,在队列:工作
命令中添加了一个新选项--stop when empty
。使用此选项时,将处理当前队列直到其为空,然后命令将退出
根据报告:
--stop when empty选项可用于指示工作人员处理所有作业,然后优雅地退出。如果要在队列为空后关闭容器,则在Docker容器内处理Laravel队列时,此选项非常有用:
如何在后台运行守护程序?我应该把重新启动队列的代码放在哪里?如果您使用--daemon标志运行,您需要认真对待文档中的内存警告。如果您正在处理大文件或执行其他内存密集型操作,则该进程可能会泄漏至少一些内存,并最终崩溃。我甚至尝试过在这些工作中释放内存,但收效甚微。最好使用Supervisor生成新的Queue::work进程。我仍然不明白Queue:listen和Queue:work--daemon之间的区别。queue:listen无限期地运行,queue:work——守护进程也无限期地运行,而不重新加载框架,那么有什么区别呢?工作和侦听看起来几乎是一样的,只是有些区别。您如何处理队列,然后在不侦听更多事件的情况下退出?@Lucas-是的,正确。要么处理一个作业并退出,要么无限期地处理。中间没有。不正确,它不在deamon模式下运行,它保持用户界面打开,不在后台运行。。。
php artisan queue:work --stop-when-empty