0Pricing
PHP Academy · Урок

Повторные попытки, задержки и цепочки заданий

Настраивайте попытки и задержки и объединяйте зависимые задания в цепочки

«Повторные попытки, задержки и цепочки заданий» — бесплатный урок PHP Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.

Максимальное число попыток

Укажите, сколько раз следует повторить задание, прежде чем переместить его в failed_jobs.

<?php
class SendWelcomeEmail implements ShouldQueue
{
    public int $tries = 3; // retry up to 3 times
}

Максимальное число исключений

Используйте $maxExceptions, чтобы ограничить повторы по количеству исключений (в отличие от попыток, которые считают все запуски, включая запуски, завершившиеся по тайм-ауту).

<?php
public int $maxExceptions = 3;

Задержка перед повтором

Укажите задержку в секундах между попытками повтора.

<?php
public int $backoff = 60; // wait 60 seconds before retry

// Or exponential backoff:
public function backoff(): array
{
    return [1, 5, 10]; // 1s, 5s, 10s between attempts
}

Тайм-аут задания

Укажите максимальное время выполнения в секундах. Если рабочий процесс превысит его, задание будет возвращено в очередь.

<?php
public int $timeout = 120; // 2 minutes max

Отправка с задержкой

Отложите задание непосредственно в месте его отправки.

<?php
SendReminder::dispatch($user)->delay(now()->addDay());
// Or pass a Carbon instance:
SendReminder::dispatch($user)->delay(Carbon::tomorrow());

fail() и release()

Внутри handle() вызовите $this->fail($exception), чтобы немедленно пометить задание как неудачное, или $this->release($delay), чтобы вернуть его в очередь с задержкой.

<?php
public function handle(): void
{
    try {
        // ...
    } catch (TransientException $e) {
        $this->release(30); // re-queue in 30 seconds
    } catch (FatalException $e) {
        $this->fail($e);   // mark as failed now
    }
}

Метод обработки сбоя

Определите в задании метод failed(), чтобы выполнить очистку после исчерпания всех попыток.

<?php
public function failed(\Throwable $exception): void
{
    // Notify team, update DB, etc.
    Log::error("Job failed: ".$exception->getMessage());
}

Цепочки заданий

Объединяйте задания в цепочку, чтобы каждое выполнялось только после успешного завершения предыдущего.

<?php
Bus::chain([
    new DownloadFile($url),
    new ProcessFile($path),
    new NotifyUser($user),
])->dispatch();

Обработка сбоев цепочки

Используйте catch(), чтобы обрабатывать сбои цепочки, не останавливая её полностью.

<?php
Bus::chain([...])
    ->catch(fn (\Throwable $e) => Log::error($e))
    ->dispatch();

Пакетная отправка заданий

Отправляйте пакет заданий параллельно и запускайте обратный вызов, когда все задания завершатся или любое из них завершится с ошибкой.

<?php
Bus::batch([
    new ImportRow($rows[0]),
    new ImportRow($rows[1]),
])->then(fn ($b) => Log::info("All done"))
  ->catch(fn ($b, $e) => Log::error($e))
  ->dispatch();

Флаги рабочего процесса очереди

Запускайте рабочие процессы с определёнными параметрами повторов и тайм-аута: php artisan queue:work --tries=3 --timeout=90. Параметры уровня задания имеют приоритет над параметрами уровня рабочего процесса.

Итоги

Задавайте $tries, $backoff и $timeout в задании. Используйте release() для временных сбоев и fail() для постоянных. Объединяйте последовательные задания с помощью Bus::chain().

Быстрая проверка

Какой метод возвращает задание в очередь с задержкой изнутри handle()?

Часто задаваемые вопросы

Урок «Повторные попытки, задержки и цепочки заданий» бесплатный?

Да — полный текст урока «Повторные попытки, задержки и цепочки заданий» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.

Чему я научусь в уроке «Повторные попытки, задержки и цепочки заданий»?

Настраивайте попытки и задержки и объединяйте зависимые задания в цепочки Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать PHP Academy?

Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Повторные попытки, задержки и цепочки заданий»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке PHP Academy?

Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы очередей и драйверы
  2. Создание и отправка заданий
  3. Повторные попытки, задержки и цепочки заданий
  4. Мониторинг очередей с Laravel Horizon
← Назад к PHP Academy