Agendador de Tarefas PHP: gerenciador de filas semelhante ao cron em PHP

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Agendador de Tarefas PHP: gerenciamento de tarefas periódicas no código



No desenvolvimento web moderno, surge frequentemente a necessidade de executar ações repetitivas: envio de newsletters por e-mail, limpeza de cache, geração de relatórios, sincronização de dados com APIs externas. Tradicionalmente, o cron do sistema (crontab) é usado para isso, mas ele requer acesso ao shell e configuração no servidor. A biblioteca Agendador de Tarefas PHP (Task Scheduler) permite implementar um comportamento semelhante ao cron diretamente em uma aplicação PHP, sem a necessidade de editar o crontab. Esta é uma solução ideal para hospedagem compartilhada, ambientes conteinerizados (Docker) ou projetos que precisam de lógica de agendamento flexível a partir do código.



Principais recursos



A biblioteca fornece uma interface fluente para definir tarefas e seus agendamentos. Principais funções:



  • Definição flexível de agendamento – suporte para expressões cron, intervalos (a cada N minutos, horas, dias), horário específico (diariamente às 03:00).
  • Execução de comandos e funções de retorno (callbacks) – é possível executar comandos shell, métodos de classes ou funções anônimas.
  • Gerenciamento de filas – integração com filas (ex.: RabbitMQ, Redis) para execução adiada.
  • Registro e notificações – suporte integrado para logs de execução, envio de erros por e-mail ou para o Sentry.
  • Segurança – prevenção de execução paralela da mesma tarefa (mutex).


Instalação e configuração



A instalação é feita via Composer:



composer require vendor/task-scheduler


Após a instalação, é necessário criar um arquivo scheduler.php, que será executado pelo cron do sistema (uma vez por minuto). Dentro do arquivo, todas as tarefas são configuradas:



<?phprequire_once __DIR__ . '/vendor/autoload.php';

use Scheduler\\Scheduler;use Scheduler\\Task;

$scheduler = new Scheduler();

// Tarefa 1: limpeza de cache a cada 30 minutos$scheduler->add(new Task('cache:clear', function() { // Lógica de limpeza de cache echo "Cache limpo em " . date('Y-m-d H:i:s') . PHP_EOL;}), '*/30 * * * *');

// Tarefa 2: envio de newsletter todos os dias às 9:00$scheduler->add(new Task('send:newsletter', 'php artisan newsletter:send'), '0 9 * * *');

// Tarefa 3: atualização de estatísticas a cada 5 minutos, mas não mais que 1 vez a cada 10 minutos$scheduler->add(new Task('update:stats', function() { // Operação longa sleep(5);}), '*/5 * * * *', [ 'mutex' => true, // proteção contra execução paralela 'timeout' => 300 // tempo máximo de execução (5 minutos)]);

$scheduler->run();?>


No crontab do sistema, é adicionada a linha:



* * * * * php /path/to/scheduler.php >> /dev/null 2>&1


Agora, o script PHP será executado a cada minuto e verificará quais tarefas precisam ser executadas.



Exemplos de uso



1. Agendador simples com callback



<?php$scheduler->add(new Task('greet', function() {    echo "Olá, Mundo!";}), '*/1 * * * *'); // A cada minuto


2. Execução de comando Artisan do Laravel



<?php$scheduler->add(new Task('reports:generate', 'php artisan reports:generate --force'), '0 2 * * 1'); // Toda segunda-feira às 2:00


3. Uso de intervalos em vez de cron



<?phpuse Scheduler\\Interval;

$scheduler->add(new Task('backup:db', 'mysqldump -u root db > backup.sql'), Interval::everyHour());// ou$scheduler->add(new Task('cleanup:logs', 'rm -rf /var/log/old/*'), Interval::everyDays(7));


4. Execução adiada através de fila



<?php$scheduler->add(new Task('process:payments', function() use ($queue) {    $queue->push(new                    

Recommendations