В чем разница между очередью: работа --daemon и очередью: слушать

Я настраиваю свой автономный сервер вакансий. Я прочитал документацию, но до сих пор не вижу различий между двумя командами: artisan queue:work --daemon и artisan queue:listen. Какую команду следует использовать для запуска моих демонов?


person Logan Bailey    schedule 25.09.2014    source источник


Ответы (4)


Редактировать обновлено 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.

person Laurence    schedule 25.09.2014
comment
Как я могу запустить демон в фоновом режиме? Где я должен поместить код для перезапуска очереди? - person Dev; 08.04.2015
comment
Если вы работаете с флагом --daemon, вам нужно серьезно отнестись к предупреждению о памяти в документации. Если вы работаете с большими файлами или выполняете другие действия, интенсивно использующие память, процесс, вероятно, приведет к утечке по крайней мере некоторой памяти и в конечном итоге приведет к сбою. Я даже пытался освободить память в этих заданиях, но без особого успеха. Лучше использовать Supervisor для создания новых процессов Queue::work. - person ShaunUK; 29.09.2015
comment
Я до сих пор не понимаю, в чем разница между queue:listen и queue:work --daemon. queue:listen работает бесконечно, и queue:work --daemon также работает бесконечно без перезагрузки фреймворка, так в чем же разница? - person Armen Markossyan; 09.03.2016
comment
Кажется, что работать и слушать практически одно и то же, с некоторыми отличиями под капотом. Как вы можете обработать очередь, а затем выйти, не прослушивая другие события? - person Lucas; 12.06.2017
comment
@Laurence, это будет обрабатывать только одно задание, а не все задания в очереди. - person Lucas; 17.06.2017
comment
@ Лукас - да, правильно. Вы либо обрабатываете одно задание и выходите, либо обрабатываете бесконечно. Между ними нет. - person Laurence; 18.06.2017
comment
Почему выполнение одного задания увеличивает объем используемой памяти? Как только задание выполнено, процесс завершается, и вся память освобождается. - person Rich Remer; 26.05.2021

Вещи были изменены, но это не было упомянуто в документе

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

теперь по умолчанию php artisan queue:work работает в режиме демона,

так что queue:work продолжайте обрабатывать задания без перезагрузки фреймворка

Команда для запуска один раз:

php artisan queue:work --once

person Alupotha    schedule 20.03.2017
comment
неправда, он не работает в режиме демона, он держит пользовательский интерфейс открытым и не работает в фоновом режиме... - person davefrassoni; 23.04.2021

Самое важное отличие состоит в том, что queue:work --daemon не перезапускает платформу при каждом задании, а queue:listen делает. Фактически, listen запускает совершенно новый процесс Laravel для каждого задания.

Попробуйте сами: откройте 2 терминала и запустите work --daemon в одном и listen в другом. Окно work будет выполнять задания намного быстрее, чем listen.

person Simon Fredsted    schedule 11.10.2016

Начиная с Laravel 5.7, в команду queue:work добавлена ​​новая опция --stop-when-empty. При использовании этой опции текущая очередь будет обрабатываться до тех пор, пока она не станет пустой, после чего команда завершит работу.

Согласно документации:

Параметр --stop-when-empty может использоваться, чтобы указать рабочему процессу обрабатывать все задания, а затем корректно завершить работу. Этот параметр может быть полезен при работе с очередями Laravel в контейнере Docker, если вы хотите закрыть контейнер после того, как очередь пуста:

php artisan queue:work --stop-when-empty
person PtrTon    schedule 23.07.2019