Повторные попытки, задержки и цепочки заданий
Настраивайте попытки и задержки и объединяйте зависимые задания в цепочки
«Повторные попытки, задержки и цепочки заданий» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы очередей и драйверы
- Создание и отправка заданий
- Повторные попытки, задержки и цепочки заданий
- Мониторинг очередей с Laravel Horizon