При создании веб-приложения у часто возникают такие задачи, выполнение которых занимает слишком много времени, такие как анализ и сохранение загруженного файла CSV, отправка почтовых сообщений и вложений. К счастью, Laravel позволяет легко создавать задания в очереди, которые могут обрабатываться в фоновом режиме. Перемещая трудоемкие задачи в очередь, приложение может реагировать на веб-запросы мгновенно.
В файле конфигурации config/queue.php
есть массив конфигурации соединений. Этот параметр определяет подключения к серверным службам очередей, таким как Amazon SQS, Beanstalk или Redis. Однако любое соединение с очередью может иметь несколько «очередей», которые можно рассматривать как разные стопки или стопки заданий, поставленных в очередь.
Обратите внимание, что каждый пример конфигурации соединения в файле конфигурации очереди содержит атрибут очереди. Это очередь по умолчанию, в которую будут отправляться задания при их отправке по данному соединению. Другими словами, если вы отправляете задание без явного указания, в какую очередь оно должно быть отправлено, задание будет помещено в очередь, определенную в атрибуте очереди конфигурации соединения:
use App\Jobs\ProcessPodcast; // This job is sent to the default connection's default queue... ProcessPodcast::dispatch(); // This job is sent to the default connection's "emails" queue... ProcessPodcast::dispatch()->onQueue('emails');По умолчанию все поставленные в очередь задания приложения хранятся в каталоге
app/Jobs
. Если каталог не существует, он будет создан при запуске Artisan-команды make:job
:
php artisan make:job ProcessPodcastПосле того как вы написали класс задания, вы можете отправить его, используя метод диспетчеризации самого задания. Аргументы, переданные методу диспетчеризации, будут переданы конструктору задания:
namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Jobs\ProcessPodcast; use App\Models\Podcast; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; class PodcastController extends Controller { /** * Store a new podcast. */ public function store(Request $request): RedirectResponse { $podcast = Podcast::create(/* ... */); // ... ProcessPodcast::dispatch($podcast); return redirect('/podcasts'); } }
Laravel включает команду Artisan, которая запускает обработчик очереди и обрабатывает новые задания по мере их помещения в очередь. Запустить этот процесс можно с помощью Artisan-команды queue:work
. Обратите внимание, что после запуска команды queue:work
она будет продолжать выполняться до тех пор, пока не будет остановлена вручную или пока вы не закроете терминал:
php artisan queue:work
Laravel предлагает Horizon, красивую панель мониторинга и систему настройки для очередей на базе Redis. Подробнее в официальной документации Laravel Horizon.