Как запускать в фоне обработку (получение) данных. Очереди.
Документация на русском.
https://laravel.su/docs/10.x/queues
1. Создать таблицу в бд
php artisan queue:table
php artisan migrate
2. В файле .env
3. Создать задание
php artisan make:job TestJob
Появится файл app/Jobs/TestJob.php
Здесь в handle - то что надо выполнить. $data - данные, переданные оттуда, где задание было отправлено в очередь.
4. В контроллере отправить задание в очередь
5. Запустить в консоли команду
php artisan queue:work
Пока она работает, задания из очереди будут выполнятся. Изменения кода в заданиях при запуске этой команды не будут учитываться. Только после перезапуска команды.
Для локальной разработки нужно использовать
php artisan queue:listen
Эта команда будет отслеживать изменения кода в заданиях и выполнять задания уже с измененным кодом.
На сервере для стабильной работы queue:work необходимо запустить через супервизор.
Для этого
1. Создать файл laravel-worker.conf в директории etc/supervisor/conf.d
здесь command - команда, которую надо запустить. Примечание: после queue:work у меня стоит слово database. Это означает, что queue:work запустить с драйвером database. В документации в примере стоит sqs, это означает запустить с драйвером sqs. Для sqs нужна зависимость aws/aws-sdk-php ~3.0 и ключи доступа из аккаунта амазон. Если не указывать, то должно запуститься с драйвером по дефолту
stdout_logfile - путь, где будет создан worker.log
2. запустить
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
3. После обновления файлов кода надо перезапустить.
sudo supervisorctl stop laravel-worker:*
Примечание:
Если создать уникальное задание (задание с уникальным ключом), то если его очистить командой php artisan queue:clear, или вручную удалить из таблицы jobs, то оно уже при выполнении dispatch оно не попадет в таблицу jobs и не запуститься. Решением является почистить кэш командой php artisan cache:clear.