Programación de tareas

Clase 12 de 33Curso Avanzado de Laravel

Resumen

Automatiza con confianza las tareas críticas en Laravel: desde enviar correos a las 3 a. m. hasta limpiar tablas, el sistema de programación con cron y el Kernel centraliza todo en un solo punto. Aquí verás cómo usar Artisan, el método schedule y controles como ejecución en un único servidor, modo mantenimiento y logs en storage.

¿Cómo programar tareas en Laravel con cron y Kernel?

Programar tareas en Laravel se hace en el método schedule de la clase Kernel ubicada en app/console/Kernel.php. Con un único cron que ejecuta php artisan schedule:run, el sistema revisa qué tareas están pendientes y las dispara automáticamente.

¿Dónde registrar comandos personalizados de Artisan?

  • Registra tus comandos en la clase Kernel de app/console/Kernel.php.
  • Ejemplos mencionados: "sendnewsletter command" y "sendemail-verification command".
  • El comando de newsletter tiene una opción --s para indicar si debe ejecutarse directamente.
  • Al ejecutar manualmente, solicita confirmación antes de enviar correos. Si no hay confirmación: "No se enviaron correos".

¿Cómo definir tareas con closures y frecuencias?

  • En schedule puedes usar funciones anónimas y devolver un simple echo "Hola".
  • Si no defines frecuencia y ejecutas el scheduler, verás "Hola" al correr el comando.
  • Cambiar la frecuencia a cada minuto mostrará "Hola" cuando corresponda. A cada cinco minutos, verás la salida solo al llegar el minuto cinco del servidor.
// app/console/Kernel.php
protected function schedule($schedule)
{
    // Comando Inspire diario.
    $schedule->command('inspire')->daily();

    // Closure simple.
    $schedule->call(function () {
        echo 'Hola';
    });
}

¿Qué cron ejecutar para disparar el scheduler?

  • Usa un único cron que llame al scheduler de Laravel.
php artisan schedule:run
  • Configura un crontab del sistema operativo o servidor para que se ejecute de forma periódica.
  • Recuerda: el scheduler verifica y ejecuta lo que esté pendiente en Kernel.

¿Qué métodos de frecuencia y control ofrece schedule?

Además de las frecuencias como diariamente, cada minuto o cada cinco minutos, existen métodos para controlar el comportamiento: ejecutar en un único servidor, permitir ejecución en modo mantenimiento, evitar solapamientos y enviar salida a un archivo de log.

¿Cómo fijar frecuencias como daily, cada minuto o Mondays?

  • Comando de newsletter que corre todos los lunes usando Mondays.
  • Comando de recordatorio de verificación de email que corre diariamente con la opción --class.
$schedule->command('sendnewsletter command')
    ->mondays();

$schedule->command('sendemail-verification-reminder-command --class')
    ->daily();
  • Frecuencias disponibles: diariamente, cada minuto, cada cinco minutos, entre otras.
  • Define la frecuencia según la necesidad del proceso.

¿Cómo limitar ejecución con on_server y mantenimiento?

  • on_server limita la ejecución a un único servidor cuando tu aplicación corre en varios.
  • Úsalo para que un usuario no reciba correos duplicados.
  • even_in_maintenance_mode permite que la tarea se ejecute aunque la app esté en modo mantenimiento.
php artisan down
$schedule->command('sendnewsletter command')
    ->mondays()
    ->on_server()
    ->even_in_maintenance_mode();
  • Ideal cuando ciertos procesos no deben detenerse durante mantenimientos programados.

¿Cómo evitar solapamientos y registrar logs?

  • without_overlapping evita que una tarea inicie si ya hay otra instancia corriendo.
  • Envía la salida de los comandos a logs con send_output_to y revisa los resultados en storage.
$schedule->command('inspire')
    ->daily()
    ->without_overlapping()
    ->send_output_to('storage/inspire.log');
  • Agrega el archivo de log al gitignore para no subirlo al repositorio.
  • Verifica en la carpeta storage que el archivo inspire.log se haya creado.

¿Qué buenas prácticas y próximos pasos aplicar?

Usa estos controles para ejecutar solo una instancia, tolerar mantenimientos y dejar huella de cada ejecución en logs. Así, enviar newsletters los lunes o recordatorios de verificación a diario será más confiable.

  • Un solo cron dispara todo con php artisan schedule:run.
  • Define frecuencia adecuada: diaria, minuto a minuto o cada cinco minutos.
  • Limita a un servidor con on_server para evitar duplicados.
  • Permite ejecución en mantenimiento con even_in_maintenance_mode.
  • Evita solapamientos con without_overlapping.
  • Centraliza logs en storage con send_output_to y exclúyelos con gitignore.

¿Te animas a ajustar el comando de newsletter con estas características y contar cómo lo harías en tu proyecto? Comparte tu enfoque en los comentarios.

      Programación de tareas