Programación de tareas

Clase 12 de 33Curso Avanzado de Laravel

Contenido del curso

Laravel y Base de Datos

    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.