Як використовувати завдання та керувати чергами в Laravel 11
Фреймворк Laravel 11 має різноманітні функції та інструменти для розробки чистого та розширеного програмного забезпечення, у тому числі Черга Laravel
Le чергу вони дозволяють нам організовувати трудомісткі завдання, такі як надсилання електронних листів або створення звітів, для обробки у фоновому режимі, звільняючи вашу програму для обробки інших запитів.
У цій статті ми розповідаємо про те, як налаштувати та використовувати черги Laravel, разом із кількома прикладами для ілюстрації їхнього практичного використання.
Приблизний час читання: 5 хвилин
Налаштування драйвера черги
Laravel підтримує кілька драйверів черги, в тому числі Redis
, Amazon SQS
e Beanstalkd
. Ви можете вибрати відповідний драйвер для своєї програми на основі ваших конкретних вимог і середовища.
Щоб налаштувати драйвер черги, перейдіть до файлу .env
у кореневому каталозі програми Laravel і встановіть змінну QUEUE_CONNECTION
на драйвері, який ви хочете використовувати:
QUEUE_CONNECTION=повтор
Створення класу Job
Далі вам потрібно буде створити клас Job
який представляє завдання, яке ви хочете обробити. The Job
за допомогою розширення інтерфейсу Illuminate\Contracts\Queue\ShouldQueue
, що означає, що завдання можна додати до черги.
Наприклад, давайте створимо роботу, яка надсилає електронного листа користувачеві:
php artisan make:job SendEmailJob
Це створить новий робочий клас у каталозі app/Jobs
. Ви можете визначити логіку роботи в методі handle
:
<?php
простір імен App\Jobs;
використовувати App\Models\Podcast;
використовувати App\Services\AudioProcessor;
використовуйте Illuminate\Bus\Queueable;
використовуйте Illuminate\Contracts\Queue\ShouldQueue;
використовуйте Illuminate\Foundation\Bus\Dispatchable;
використовуйте Illuminate\Queue\InteractsWithQueue;
використовувати Illuminate\Queue\SerializesModels;
клас SendEmailJob реалізує ShouldQueue
{
використовувати Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
захищений $користувач;
/ **
* Створіть новий екземпляр завдання.
*/
публічна функція __construct(Користувач $користувач)
{
$this->user = $user;
}
/ **
* Виконати завдання.
*/
публічна функція handle()
{
Mail::to($this->user->email)->send(new \App\Mail\WelcomeEmail($this->user));
}
}
У цьому прикладі ми бачимо, що ми передаємо a Промовиста модель безпосередньо в конструкторі Job
in queue
. Завдяки SerializesModels
використаний Job
, моделі Eloquent
і відповідні завантажені відносини будуть серіалізовані під час обробки Job
.
Це означає, що якщо Job
в черзі приймає модель Красномовна у його конструкторі лише ідентифікатор моделі буде серіалізовано в queue
. Коли job
є фактично керованою системою queue
автоматично отримає повний екземпляр моделі та його відносини, завантажені з база даних. Такий підхід до серіалізації моделі дозволяє відправляти payload
di job
набагато менший ніж у водія queue
.
Надішліть завдання до черги Laravel
Після визначення класу job
, ми можемо надіслати його queue
використовуючи метод dispatch
. Наприклад, давайте зробимо dispatch
Дель Job SendEmailJob
, надання об'єкта $user
як параметр:
$user = Користувач::знайти(1);
dispatch(new SendEmailJob($user));
В якості альтернативи ми можемо використовувати метод dispatchNow
щоб негайно запустити завдання, не додаючи його до черги:
dispatch_now(нова SendEmailJob($user));
Існують різні методи або умови для відправки завдання, щоб дізнатися більше про використання цих методів, я рекомендую вам прочитати документацію Laravel 11, натиснувши тут. Зокрема:
- Надсилання затримано
- Надіслати після відповіді браузера
- Синхронна диспетчеризація
- Роботи та переходи БД
- Ланцюжок роботи
- Обробка помилок
Процес queue
компанії Laravel
Для обробки job
in queue
, вам потрібно буде почати a worker
з queue
. Для цього Laravel надає команду php artisan queue:work
, який виконує а worker
який постійно ставить під сумнів queue
і обробляє job
коли вони стають доступними.
php artisan queue:work
Ви також можете вказати назву queue
і кількість робочих потоків, які використовують параметри --queuee
--tries
:
php artisan queue:work --queue=emails --tries=3
Буде виконано worker
який обробляє job
від queue
emails
і повторюйте невдалі завдання до трьох разів.
Monitor
з queue
Ви можете стежити за станом job
у черзі за допомогою пакета Laravel Horizon
, яка надає інформаційну панель, яка відображає інформацію про worker
in queue
, sui job
і далі job
невдалий.
Для встановлення та налаштування Laravel Horizon
, виконайте таку команду:
композитор вимагає laravel/horizon
Управління збігами завдань
Laravel містить проміжне програмне забезпечення, яке допомагає уникнути збігів завдань: Illuminate\Queue\Middleware\WithoutOverlapping
. Наприклад, припустімо, що завдання в черзі змінює ресурс, який слід модифікувати виключно.
Наприклад, кредит, баланс тощо. Тобто інформація, яка під час оновлення не може бути оновлена одночасно іншими процесами.
Для цього ми можемо повернути метод WithoutOverlapping
від роботи метод middleware
:
use Illuminate\Queue\Middleware\WithoutOverlapping;
/**
* Get the middleware the job should pass through.
*
* @return array<int, object>
*/
public function middleware(): array
{
return [new WithoutOverlapping($this->user->id)];
}
Будь-які завдання одного типу, що збігаються, повертаються в чергу. Ви також можете вказати кількість секунд, яка має пройти перед повторною спробою звільненого завдання:
public function middleware(): array
{
return [(new WithoutOverlapping($this->order->id))->releaseAfter(60)];
}
Якщо ви хочете негайно видалити будь-які завдання, що збігаються, щоб їх не повторювати, ви можете скористатися цим методом dontRelease
:
public function middleware(): array
{
return [(new WithoutOverlapping($this->order->id))->dontRelease()];
}
Проміжне програмне забезпечення WithoutOverlapping
він підтримується функцією атомного блоку Laravel. Іноді завдання може неочікувано завершитися помилкою або закінчитися, тому блокування не буде знято. Таким чином, ви можете явно визначити термін дії блокування за допомогою методу expireAfter
. Наприклад, наступний приклад накаже Laravel зняти блокування WithoutOverlapping
через три хвилини після початку обробки завдання:
public function middleware(): array
{
return [(new WithoutOverlapping($this->order->id))->expireAfter(180)];
}
Le черга Laravel вони забезпечують потужний спосіб обробки трудомістких завдань у фоновому режимі, дозволяючи програмі ефективно обробляти інші запити. Дотримуючись кроків, описаних у цій статті, ви зможете легко налаштувати та використовувати Черги Laravel у вашій заявці. З можливістю моніторингу та керування чергою за допомогою Laravel Horizon, ви можете забезпечити безперебійну та ефективну роботу вашої програми. Використовуючи Черги Laravel, ви можете надати кращий досвід користувача своїм клієнтам і покращити загальну продуктивність вашої програми.
Пов'язані читання
Ercole Palmeri