PHP Academy · Lección

Reintentos, retrasos y encadenamiento de jobs

Configure intentos y retrasos, y encadene jobs dependientes.

Lección 3 de 413 pasos

Reintentos, retrasos y encadenamiento de jobs es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.

Número máximo de intentos

Establezca cuántas veces debe reintentarse un job antes de trasladarlo a failed_jobs.

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

Número máximo de excepciones

Use $maxExceptions para limitar los reintentos según el número de excepciones (a diferencia de attempts, que cuenta todos los intentos, incluidos los tiempos de espera agotados).

<?php
public int $maxExceptions = 3;

Tiempo entre reintentos

Establezca un retraso (en segundos) entre los intentos de reintento.

<?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
}

Tiempo de espera del Job

Establezca un tiempo máximo de ejecución en segundos. Si el trabajador lo supera, el job vuelve a ponerse en la cola.

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

Enviar con retraso

Retrase un job desde el punto del código en el que se envía.

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

fail() y released()

Dentro de handle(), llame a $this->fail($exception) para marcar inmediatamente el job como fallido o a $this->release($delay) para volver a ponerlo en la cola con un retraso.

<?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
    }
}

Método failed()

Defina un método failed() en el job para ejecutar tareas de limpieza cuando se hayan agotado todos los intentos.

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

Encadenar Jobs

Encadene jobs para que cada uno se ejecute únicamente después de que el anterior se complete correctamente.

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

Capturar errores de la cadena

Use catch() para gestionar los errores de la cadena sin detenerla por completo.

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

Bus::batch()

Envíe un lote de jobs en paralelo y ejecute una devolución de llamada cuando todos terminen o cuando alguno falle.

<?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();

Opciones del trabajador de cola

Inicie los trabajadores con configuraciones específicas de reintentos y tiempo de espera: php artisan queue:work --tries=3 --timeout=90. La configuración del job prevalece sobre la del trabajador.

Resumen

Establezca $tries, $backoff y $timeout en el job. Use release() para fallos temporales y fail() para los permanentes. Encadene jobs secuenciales con Bus::chain().

Comprobación rápida

¿Qué método vuelve a poner un job en la cola con un retraso desde dentro de handle()?

Gratis para empezar

Aprende PHP con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
49
Lecciones
195

Preguntas frecuentes

¿La lección «Reintentos, retrasos y encadenamiento de jobs» es gratis?

Sí — el texto completo de «Reintentos, retrasos y encadenamiento de jobs» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Reintentos, retrasos y encadenamiento de jobs»?

Configure intentos y retrasos, y encadene jobs dependientes. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar PHP Academy?

No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Reintentos, retrasos y encadenamiento de jobs»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de PHP Academy?

Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos y controladores de colas
  2. Creación y envío de jobs
  3. Reintentos, retrasos y encadenamiento de jobs
  4. Monitorización de colas con Laravel Horizon
← Volver a PHP Academy