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)enapp/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:pauseyschedule:resumepara 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
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