Очереди Laravel. Как выполнять задачи в фоне?

В контроллере использую такой код:
(практически пример из документации)

$job = (new DownloadItem($data))->onQueue('save');
dispatch($job);

return redirect('/cabinet/itemlist');


все работает нормально, но проблема в том что все выполняется как обычно, и пока не обработается полностью то, что прописано в DownloadItem (долгий процесс, загрузка изображений) не срабатывает редирект.

подскажите, как достичь эффекта добавления очереди, чтобы задача выполнялась в фоне.
и моментально выполнился запрос на редирект redirect('/cabinet/itemlist'); ?

Спасибо.
  • Вопрос задан
  • 9965 просмотров
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
Читаем внимательно документацию: https://laravel.com/docs/queues

Если коротко, то по умолчанию у вас в env используется QUEUE_DRIVER=sync, что по сути значит "никаких очередей, выполняй всё сразу". Если вы хотите, чтобы очереди выполнялись в фоне, вам нужно изменить драйвер на один из подходящих вариантов. К примеру, если изменить на database и создать в БД нужные таблицы, то все задания будут помещаться в эти таблицы. Для их выполнения нужно либо запускать php artisan queue:work (одноразовое выполнение всех заданий), либо php artisan queue:work --daemon (демон, который будет висеть и мониторить добавление заданий в очередь), либо, лучше всего, использовать supervisor, который будет сам следить за тем, чтобы демон висел в памяти.

Всё это легко гуглится, ключевые слова в предыдущем абзаце. Supervisor есть смысл использовать только на продакшене, но если не хотите заморачиватся с его установкой и настройкой, достаточно будет добавить в автозапуск только запуск демона очереди. Правда если по какой-то причини процесс вылетит - вам нужно будет вручную его перезагрузить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
Единственное, что приходит в голову, это либо передать задачу внешнему приложению, либо попробовать запустить задачу в отдельном потоке, но на счёт PHP я не уверен, насколько хорошо такая идея сработает и сработает ли вообще, т.к. у PHP есть параметр "ограничение времени работы скрипта", "количество пулов", иначе говоря, изначально PHP не рассчитан на работу "в режиме реального времени".

Обычно, для задач используют планировщики, например, записать в базу список задач, которые нужно делать, а планировкщик каждые N-минут ходит по ним, проверяет и выполняет их по списку соотв. Либо, как я уже писал выше - передайте управление внешнему приложению (если очень хочется, это может быть PHP-скрипт, запущенный в CLI-режиме [т.е. без веб-сервера], который не имеет ограничений на время выполнения).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы