laravel

Очереди в Laravel + Supervisor

В этой небольшой статье мы на примере нескольких строчек кода узнаем что такое очереди Laravel и научимся их использовать.

Переключим настройку работы наших очередей с синхронного режима на database через файл .env:

QUEUE_CONNECTION=database

Создадим таблицу для хранения очередей (по умолчанию Jobs):

php artisan queue:table
php artisan migrate

Создадим класс джобы для тестирования

php artisan make:job JobTest

(JobTest создастся по адресу App/Jobs/)

Откроем её и добавим в метод handle код:

$msg = 'hello '.date('d-m-Y H:i:s');
file_put_contents(storage_path().'/jobjest.txt', $msg);

Попробуем добавить нашу джобу в очередь на выполнение:

php artisan tinker
$job = new \App\Jobs\JobTest();
$job->delay(60); //отсрочим запуск на 60 секунд 
dispatch($job)->onQueue('myQueue'); //добавим в особую очередь myQueue

Откроем любой менеджер БД и убедимся что добавилась новая джоба: [ИМЯ НАШЕЙ БД]->[jobs] <= тут в таблице jobs должна появиться новая строчка со всеми данными джобы

Выполним команду чтобы вручную запустить джобу на выполнение:

php artisan queue:work --queue=high,default,myQueue

Profit!

Статья списана с одноименного видео-урока: Laravel очереди учимся использовать и что это такое | Laravel Queues | Laravel Jobs

ps: Обратите внимание что "очердь" и "job" это разные вещи. В каждую очередь поступают новые задачи(jobs) на выполнение. Логика вашего приложения сама будет решать в какую очередь добавить ту или иную задачу. У каждой очереди свои всевозможные параметры, например кол-во максимальной выделяемой оперативки, кол-во попыток выполнения при ошибке (У Laravel это все настраивается в "Supervisor"). 

Настройка супервизора для Laravel

Для автоматического запуска очередей необходимо настроить Supervisor

Установить командой : 

sudo apt-get install supervisor

# 1. Создать файл конфигурации (ниже указано его примерное содержимое)
vi /etc/supervisor/conf.d/laravel-worker.conf

# 2. Перезагрузить конфигурационные файлы демона:

sudo supervisorctl reread

> laravel-worker: available

 

# 3. Перезагрузить файлы конфигураций и добавить/удалить необходимые

sudo supervisorctl update

> laravel-worker: added process group

 

# 4. Запустить все процессы группы "laravel-worker"

sudo supervisorctl start laravel-worker:*

# 5. Посмотреть статус всех процессов группы "laravel-worker"

sudo supervisorctl status laravel-worker:*

> laravel-worker:laravel-worker_00   RUNNING   pid 23758, uptime 0:00:16
> laravel-worker:laravel-worker_01   RUNNING   pid 23759, uptime 0:00:16

 

# 6. После изменения в PHP исходниках вы должны перезапустить очередь, поскольку queue:work работает как демон

php artisan queue:restart

> Broadcasting queue restart signal.

 

Содержимое файла /etc/supervisor/conf.d/laravel-worker.conf

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --sleep=3 --tries=2
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/storage/logs/supervisor_queue-work.log

Другие полезные команды:

sudo php artisan config:cache
sudo php artisan config:clear
sudo php artisan queue:restart
Афоризм дня:
Лучше спокойно подчиняться, чем властвовать самому. (585)

4 years ago

А как добавить несколько очередей? Например, есть очередь для отправки уведомлений и очередь для экспорта в csv. В таком случае нужно создавать новый .conf или добавлять в laravel-worket?

4 years ago

Добавить несколько очередей можно разными способами. "laravel-worker" это название очереди "[program:laravel-worker]" - это заголовок секции конфигурации очереди. В вашем случае следует создать новую секцию например: [program:laravel-worker2]

4 years ago

Очередь добавится, если еще раз выполнить $job = new \App\Jobs\JobTest();

2 years ago

Ты издеваешься, только честно? Почему нельзя сразу содержимое вставить. Час не понимал почему после рерида не показывает мой файл конфига (я создал пустой .кнфг). Ты написал (ниже указано его примерное содержимое) и оставил строку vi /etc/supervisor/conf.d/laravel-worker.conf Как можно было понять, что код снизу статьи надо в файл писать, в этом же нету последовательности?

2 years ago

Наконец-то статья, где все понято👍😍

6 months ago

Спасибо за материал. Всё работает.

Leave a reply

Яндекс.Метрика