Qué es la programación de tareas
Tradicionalmente, cada tarea periódica requería añadir manualmente una entrada al cron del servidor. El problema es que la definición vivía fuera del código fuente, sin control de versiones y con la necesidad de acceder por SSH para revisarla o modificarla. Con el scheduler de Laravel defines la programación de tareas dentro de la propia aplicación con una API fluida. Solo necesitas una entrada de cron en el servidor, y las tareas quedan versionadas junto al código. Lo habitual es definir la programación enroutes/console.php.
Con el comando Artisan
schedule:list puedes ver todas las tareas definidas y su próxima ejecución.Flujo de ejecución del scheduler
Cómo definir la programación
La programación se define enroutes/console.php.
También puedes definirla en el método withSchedule de bootstrap/app.php.
Tipos de tareas programables
Comandos Artisan
Concommand programas un comando Artisan.
Puedes pasar el nombre o la clase del comando.
Jobs de cola
Conjob programas un job de cola. Es una forma cómoda de encolarlo sin closures.
Comandos de shell
Conexec ejecutas un comando del sistema operativo.
Closures
Concall programas cualquier closure PHP.
__invoke).
Configurar la frecuencia
Métodos más habituales
Expresiones cron directamente
Concron puedes pasar la expresión directamente.
Combinar frecuencia y días
Combinando frecuencia y restricciones por día obtienes programaciones más finas.Configurar la zona horaria
Contimezone indicas la zona horaria de una tarea concreta.
schedule_timezone en config/app.php.
Restricciones condicionales
when / skip
when ejecuta la tarea solo si la closure devuelve true.
skip hace lo contrario: la salta si devuelve true.
environments
Conenvironments restringes a determinados entornos.
Restricciones horarias
Conbetween / unlessBetween limitas el rango horario.
Restricciones por día
Evitar solapamientos
Por defecto, aunque la ejecución anterior no haya terminado, se inicia la siguiente. ConwithoutOverlapping la nueva ejecución espera a que termine la anterior.
withoutOverlapping gestiona el lock en la caché de la aplicación.
Si una tarea queda atascada, puedes liberarlo con schedule:clear-cache.Ejecución en varios servidores
Cuando el scheduler se ejecuta en varios servidores, cononOneServer te aseguras de que solo uno ejecute la tarea.
Flujo de control distribuido con onOneServer()
Agrupar tareas
Congroup aplicas la misma configuración a varias tareas.
Ejecución en segundo plano
Por defecto, las tareas programadas al mismo tiempo se ejecutan en el orden en el que se definen. Si una es lenta, retrasa a las siguientes. ConrunInBackground se ejecutan en paralelo.
Modo mantenimiento
En modo mantenimiento no se ejecutan las tareas programadas. Para forzar la ejecución incluso en mantenimiento, usaevenInMaintenanceMode.
Flujo de decisión en modo mantenimiento
Pausar el scheduler
Puedes pausarlo sin modificar código.evenWhenPaused. Útil para health checks o monitorización.
Manejo de la salida
Enviar la salida a un archivo
ConsendOutputTo guardas la salida.
appendOutputTo la añades al final del archivo existente.
Enviar la salida por correo
ConemailOutputTo la salida se envía por correo (necesitas la configuración de correo de Laravel).
emailOutputOnFailure.
Hooks de tarea
Conbefore / after ejecutas lógica antes y después de la tarea.
onSuccess / onFailure reaccionas al resultado.
Despliegue en servidor
1
Añadir la entrada de cron
Con esta línea en el crontab del servidor, el scheduler se ejecutará cada minuto.Ábrelo con
crontab -e.2
Comprobar el scheduler
Muestra las tareas definidas y su próxima ejecución.
Ejecución en desarrollo local
En local, en vez de usar cron, puedes mantener el scheduler activo conschedule:work.
Ctrl+C.
Tareas sub-minuto (con periodicidad inferior a 1 minuto)
Cron usa un minuto como unidad mínima; en Laravel puedes programar tareas por segundos.schedule:run sigue corriendo durante el minuto en curso para procesarlas todas.
Para interrumpir un schedule:run en curso durante un despliegue, añade esto al script: