Я устанавливаю свой автономный сервер заданий. Я прочитал документацию, но я до сих пор не вижу различий между двумя командами: artisan queue:work --daemon
и artisan queue:listen
. Какую команду я должен использовать для запуска моих демонов?
В чем разница между очередью: work --daemon и queue: listen
Ответ 1
Изменить обновленный 2017-04-07:
Теперь есть три способа запуска вашей очереди:
-
queue:work
- это новый процесс "демон" (флаг больше не требуется). Рамка будет запускаться "один раз", а затем продолжит цикл через задания. Это будет продолжаться бесконечно. Он использует меньше памяти/процессора, чемqueue:listen
, потому что структура остается на все время. Вы также должны запомнитьqueue:restart
, чтобы заставить очередь обновлять любые изменения кода, которые вы нажимаете во время исправления. -
queue:work --once
- это запустит фреймворк, обработает одно задание, а затем выключит. Полезно для тестирования во время разработки и т.д. -
queue:listen
- это запустит фреймворк на каждом цикле, обработает одно задание, затем полностью отключится, а затем снова запустит фрейм и т.д. и зациклирует на неопределенный срок. Это означает, что все память/процессы освобождаются после обработки каждого задания. Если у вас есть утечки памяти с помощьюqueue:work
- попробуйте.
Флаг --daemon
больше не влияет на эти команды.
Оригинальный ответ:
Здесь перечислены две разные проблемы.
Существует artisan queue:work
и artisan queue:listen
-
queue:work
просто вытолкнет следующее задание в очереди и обработает только одно задание. Это команда "один раз", которая вернется в командную строку после обработки одной команды очереди. -
queue:listen
будет прослушивать очередь и продолжать обрабатывать любые команды очереди, которые он получает. Это будет продолжаться бесконечно, пока вы не остановите его.
В Laravel >= 4.2 добавлена команда --daemon
. То, как он работает, просто просто запускает очереди напрямую, а не перезагружает всю структуру после обработки каждой очереди. Это необязательная команда, которая значительно снижает требования к памяти и процессору вашей очереди.
Важным моментом с командой --daemon
является то, что при обновлении приложения вам необходимо специально перезапустить свою очередь с помощью queue:restart
, иначе вы могли бы получить всевозможные странные ошибки, так как ваша очередь все равно будет иметь старую кода в памяти.
Итак, чтобы ответить на ваш вопрос "Какую команду я должен использовать для запуска моих демонов?" - ответ почти всегда queue:work --daemon
Ответ 2
Вещи были изменены, но это не было упомянуто в документе
--daemon Run the worker in daemon mode (Deprecated)
теперь по умолчанию php artisan queue:work
выполняется в режиме демона,
queue:work
так queue:work
продолжается обработка заданий без перезагрузки фреймворка
для запуска, как только команда
php artisan queue:work --once
Ответ 3
Самое важное отличие состоит в том, что queue:work --daemon
не перезапускает фреймворк для каждого задания, а queue:listen
делает. Фактически, listen
запускает новый новый процесс Laravel для каждого задания.
Попробуйте сами: Откройте 2 терминала и запустите work --daemon
в одном и listen
в другом. Окно work
будет выполнять задания намного быстрее, чем listen
.
Ответ 4
Начиная с Laravel 5.7, в команду queue:work
добавлена новая опция --stop-when-empty
. При использовании этой опции текущая очередь будет обрабатываться до тех пор, пока она не опустеет, затем команда завершится.
Согласно документации:
Опция --stop-when-empty может использоваться, чтобы дать работнику команду обработать все задания и затем завершить работу корректно. Эта опция может быть полезна при работе с очередями Laravel в контейнере Docker, если вы хотите закрыть контейнер после того, как очередь пуста:
php artisan queue:work --stop-when-empty