Як використовувати завдання та керувати чергами в Laravel 11

черга laravel

Фреймворк 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

Авторе

Вам може бути цікаво…