Planificador de tareas PHP: gestor de colas similar a cron en PHP

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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-scheduler


Despué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>&1


Ahora 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 minuto


2. 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:00


3. 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                    

Recommendations