Planificador de tareas PHP: gestión de tareas periódicas en código
En el desarrollo web moderno, a menudo surge la necesidad de ejecutar acciones repetitivas: envío de boletines por correo electrónico, limpieza de caché, generación de informes, sincronización de datos con API externas. Tradicionalmente, para esto se utiliza el cron del sistema (crontab), pero requiere acceso al shell y configuración en el servidor. La biblioteca Planificador de tareas PHP (Task Scheduler) permite implementar un comportamiento similar a cron directamente en la aplicación PHP, sin necesidad de editar el crontab. Esta es una solución ideal para hosting compartido, entornos contenedorizados (Docker) o proyectos donde se necesita una lógica de planificación flexible desde el código.
Características principales
La biblioteca proporciona una interfaz fluida para definir tareas y sus horarios. Funciones clave:
- Definición flexible de horarios – soporte para expresiones cron, intervalos (cada N minutos, horas, días), hora específica (diariamente a las 03:00).
- Ejecución de comandos y funciones callback – se pueden ejecutar comandos de shell, métodos de clases o funciones anónimas.
- Gestión de colas – integración con colas (por ejemplo, RabbitMQ, Redis) para ejecución diferida.
- Registro y notificaciones – soporte integrado para registros de ejecución, envío de errores por correo electrónico o a Sentry.
- Seguridad – prevención de ejecución paralela de la misma tarea (mutex).
Instalación y configuración
La instalación se realiza a través de Composer:
composer require vendor/task-schedulerDespués de la instalación, es necesario crear un archivo scheduler.php, que se ejecutará mediante el cron del sistema (una vez por minuto). Dentro del archivo se configuran todas las tareas:
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use Scheduler\\Scheduler;use Scheduler\\Task;
$scheduler = new Scheduler();
// Tarea 1: limpiar caché cada 30 minutos$scheduler->add(new Task('cache:clear', function() { // Lógica de limpieza de caché echo "Cache cleared at " . date('Y-m-d H:i:s') . PHP_EOL;}), '*/30 * * * *');
// Tarea 2: enviar boletín cada día a las 9:00$scheduler->add(new Task('send:newsletter', 'php artisan newsletter:send'), '0 9 * * *');
// Tarea 3: actualizar estadísticas cada 5 minutos, pero no más de 1 vez cada 10 minutos$scheduler->add(new Task('update:stats', function() { // Operación larga sleep(5);}), '*/5 * * * *', [ 'mutex' => true, // protección contra ejecución paralela 'timeout' => 300 // tiempo máximo de ejecución (5 minutos)]);
$scheduler->run();?>En el crontab del sistema se agrega la línea:
* * * * * php /path/to/scheduler.php >> /dev/null 2>&1Ahora el script PHP se ejecutará cada minuto y verificará qué tareas deben ejecutarse.
Ejemplos de uso
1. Planificador simple con callback
<?php$scheduler->add(new Task('greet', function() { echo "Hello, World!";}), '*/1 * * * *'); // Cada minuto2. Ejecución de un comando Artisan de Laravel
<?php$scheduler->add(new Task('reports:generate', 'php artisan reports:generate --force'), '0 2 * * 1'); // Cada lunes a las 2:003. Uso de intervalos en lugar de cron
<?phpuse Scheduler\\Interval;
$scheduler->add(new Task('backup:db', 'mysqldump -u root db > backup.sql'), Interval::everyHour());// o$scheduler->add(new Task('cleanup:logs', 'rm -rf /var/log/old/*'), Interval::everyDays(7));4. Ejecución diferida a través de cola
<?php$scheduler->add(new Task('process:payments', function() use ($queue) { $queue->push(new También en la biblioteca
Las mejores bibliotecas de logging para Go (Golang): revisión y comparativa
Generación de informes PDF en C# (.NET): iTextSharp, QuestPDF, PDFsharp
Procesamiento de imágenes en Go: cambio de tamaño y recorte (resize, crop)
Tokens JWT en Rust: bibliotecas e implementación de autenticación