Agendador de Tarefas PHP: guia completo
O Agendador de Tarefas (Task Scheduler) é uma ferramenta criticamente importante para qualquer aplicação web que funcione em PHP. Ele permite automatizar a execução de operações rotineiras: envio de newsletters por e-mail, limpeza de cache, geração de relatórios, sincronização de dados com APIs externas e muito mais. Diferentemente da execução manual de scripts, o agendador garante a execução pontual e confiável das tarefas sem a intervenção do administrador.
Abordagens básicas para implementar um agendador em PHP
Existem duas formas principais de implementar um agendador de tarefas em projetos PHP:
- Cron do sistema (Linux/Unix) — uso do daemon cron integrado para chamar scripts PHP em horários agendados.
- Agendador personalizado (Task Scheduler) — implementação da lógica de agendamento diretamente no código PHP usando loops e verificações de tempo.
1. Cron do sistema com PHP
A abordagem mais comum e eficiente. Você cria um script PHP que executa as ações necessárias e, em seguida, adiciona uma entrada no crontab do servidor.
Exemplo de script PHP para cron (cron_job.php):
<?php// cron_job.php - executa a limpeza de sessões antigasrequire_once 'config.php';require_once 'db.php';
$stmt = $pdo->prepare("DELETE FROM sessions WHERE last_activity < NOW() - INTERVAL 1 DAY");$stmt->execute();
// Registro de execuçãofile_put_contents('logs/cron.log', date('Y-m-d H:i:s') . " - Sessões limpas", FILE_APPEND);?>Entrada no crontab (executar a cada hora):
0 * * * * /usr/bin/php /var/www/html/cron_job.php2. Task Scheduler personalizado em PHP
Se você não tem acesso ao cron do sistema (por exemplo, em hospedagem compartilhada), é possível implementar um agendador diretamente em PHP. Para isso, utiliza-se um script especial que é executado a cada visita ao site ou por requisição HTTP.
Exemplo de um agendador simples (task_scheduler.php):
<?phpclass TaskScheduler { private $tasks = []; private $lastRunFile = 'last_run.json';
public function addTask($name, callable $callback, $interval) { $this->tasks[] = [ 'name' => $name, 'callback' => $callback, 'interval' => $interval // em segundos ]; }
public function run() { $lastRun = $this->getLastRunTimes();
foreach ($this->tasks as $task) { $lastTime = $lastRun[$task['name']] ?? 0; if (time() - $lastTime >= $task['interval']) { echo "Executando tarefa: {$task['name']}"; call_user_func($task['callback']); $lastRun[$task['name']] = time(); } }
file_put_contents($this->lastRunFile, json_encode($lastRun)); }
private function getLastRunTimes() { if (file_exists($this->lastRunFile)) { return json_decode(file_get_contents($this->lastRunFile), true); } return []; }}
// Uso$scheduler = new TaskScheduler();
$scheduler->addTask('send_newsletter', function() { // Lógica de envio de newsletter echo "Newsletter enviada";}, 3600); // A cada hora
$scheduler->addTask('clean_cache', function() { // Limpeza de cache array_map('unlink', glob('cache/*.cache')); echo "Cache limpo";}, 86400); // Uma vez por dia
$scheduler->run();?>3. Agendador avançado com suporte a expressões CRON
Para um gerenciamento mais flexível do agendamento, é possível implementar suporte a expressões cron clássicas (minuto, hora, dia, mês, dia da semana).
Exemplo de parser de expressões cron:
<?phpclass CronPar Também na biblioteca
AVFoundation para Swift: guia completo com exemplos
ORM para Swift (iOS/macOS): comparação e exemplos de uso
Configuração de aplicações Go (Golang): bibliotecas e ferramentas
Supertest para JavaScript (Node.js): guia completo com exemplos práticos