Programación de tareas con el Scheduler

Intermedio
Laravel
Laravel
Actualizado: 27/03/2026

El Task Scheduler

Laravel incluye un Task Scheduler que programa comandos Artisan y cierres (callables) sin añadir entradas cron por cada tarea: basta con un único cron que ejecute schedule:run cada minuto.

En aplicaciones recientes (Laravel 11+) sueles definir el calendario de una de estas formas (según la plantilla del proyecto):

Opción A: routes/console.php

Muchos esqueletos registran el calendario en routes/console.php con la facade Schedule:

use Illuminate\Support\Facades\Schedule;

Schedule::command('emails:send')->daily();
Schedule::command('backup:run')->weeklyOn(1, '2:00');
Schedule::call(function () {
    // Lógica inline
})->hourly();

Opción B: bootstrap/app.php con withSchedule

Otra convención es cerrar la configuración de la aplicación en bootstrap/app.php usando withSchedule:

use Illuminate\Console\Scheduling\Schedule;

->withSchedule(function (Schedule $schedule) {
    $schedule->command('emails:send')->daily();
})

En proyectos legacy o plantillas antiguas aún verás protected function schedule(Schedule $schedule) en app/Console/Kernel.php. El comportamiento del Scheduler es el mismo; solo cambia el archivo donde se declara.

Inspección y desarrollo

  • php artisan schedule:list: lista tareas, expresiones y próximas ejecuciones.
  • php artisan schedule:work: en local, ejecuta el Scheduler en bucle (sustituye al cron mientras desarrollas).
  • En versiones recientes del framework existen también comandos como schedule:pause y schedule:resume para pausar o reanudar el calendario en despliegues.

Frecuencias habituales

| Método | Frecuencia | |--------|------------| | ->everyMinute() | Cada minuto | | ->hourly() | Cada hora | | ->daily() | Diariamente a medianoche | | ->weekly() | Semanalmente | | ->monthly() | Mensualmente | | ->cron('* * * * *') | Expresión cron personalizada |

Puedes encadenar condiciones:

$schedule->command('report:generate')
    ->dailyAt('3:00')
    ->when(fn () => config('app.env') === 'production');

Configurar el cron

En el servidor solo necesitas una entrada cron que ejecute el scheduler cada minuto:

* * * * * cd /ruta/proyecto && php artisan schedule:run >> /dev/null 2>&1

Laravel decidirá qué tareas deben ejecutarse en cada pasada. Para desarrollo local puedes usar php artisan schedule:work, que ejecuta el scheduler en un bucle continuo.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Laravel es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Laravel

Explora más contenido relacionado con Laravel y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Programar comandos y cierres para que se ejecuten a intervalos definidos con el Task Scheduler.

Cursos que incluyen esta lección

Esta lección forma parte de los siguientes cursos estructurados con rutas de aprendizaje