PHP-Aufgabenplaner: Verwaltung periodischer Aufgaben im Code
In der modernen Webentwicklung besteht häufig die Notwendigkeit, wiederkehrende Aktionen auszuführen: Versand von E-Mail-Newslettern, Cache-Bereinigung, Berichtserstellung, Datensynchronisation mit externen APIs. Traditionell wird dafür der systemeigene Cron (Crontab) verwendet, der jedoch Shell-Zugriff und Serverkonfiguration erfordert. Die Bibliothek PHP-Aufgabenplaner (Task Scheduler) ermöglicht es, ein cron-ähnliches Verhalten direkt in der PHP-Anwendung zu implementieren, ohne die Crontab bearbeiten zu müssen. Dies ist die ideale Lösung für Shared-Hosting, Container-Umgebungen (Docker) oder Projekte, die eine flexible Planungslogik aus dem Code benötigen.
Hauptfunktionen
Die Bibliothek bietet eine fließende Oberfläche (Fluent-Interface) zur Definition von Aufgaben und deren Zeitplänen. Die wichtigsten Funktionen:
- Flexible Zeitplandefinition – Unterstützung für Cron-Ausdrücke, Intervalle (alle N Minuten, Stunden, Tage), bestimmte Zeiten (täglich um 03:00 Uhr).
- Ausführung von Befehlen und Callback-Funktionen – Shell-Befehle, Klassenmethoden oder anonyme Funktionen können ausgeführt werden.
- Warteschlangenverwaltung – Integration mit Warteschlangen (z. B. RabbitMQ, Redis) für verzögerte Ausführung.
- Protokollierung und Benachrichtigungen – Integrierte Unterstützung für Ausführungsprotokolle, Fehlersendung per E-Mail oder an Sentry.
- Sicherheit – Verhinderung der parallelen Ausführung derselben Aufgabe (Mutex).
Installation und Konfiguration
Die Installation erfolgt über Composer:
composer require vendor/task-schedulerNach der Installation muss eine Datei scheduler.php erstellt werden, die über den systemeigenen Cron (einmal pro Minute) ausgeführt wird. Innerhalb der Datei werden alle Aufgaben konfiguriert:
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use Scheduler\\Scheduler;use Scheduler\\Task;
$scheduler = new Scheduler();
// Aufgabe 1: Cache-Bereinigung alle 30 Minuten$scheduler->add(new Task('cache:clear', function() { // Logik zur Cache-Bereinigung echo "Cache cleared at " . date('Y-m-d H:i:s') . PHP_EOL;}), '*/30 * * * *');
// Aufgabe 2: E-Mail-Newsletter täglich um 9:00 Uhr senden$scheduler->add(new Task('send:newsletter', 'php artisan newsletter:send'), '0 9 * * *');
// Aufgabe 3: Statistikaktualisierung alle 5 Minuten, aber nicht häufiger als einmal alle 10 Minuten$scheduler->add(new Task('update:stats', function() { // Langwierige Operation sleep(5);}), '*/5 * * * *', [ 'mutex' => true, // Schutz vor paralleler Ausführung 'timeout' => 300 // Maximale Ausführungszeit (5 Minuten)]);
$scheduler->run();?>In der systemeigenen Crontab wird folgende Zeile hinzugefügt:
* * * * * php /path/to/scheduler.php >> /dev/null 2>&1Das PHP-Skript wird nun jede Minute ausgeführt und prüft, welche Aufgaben auszuführen sind.
Anwendungsbeispiele
1. Einfacher Planer mit Callback
<?php$scheduler->add(new Task('greet', function() { echo "Hello, World!";}), '*/1 * * * *'); // Jede Minute2. Ausführen eines Laravel-Artisan-Befehls
<?php$scheduler->add(new Task('reports:generate', 'php artisan reports:generate --force'), '0 2 * * 1'); // Jeden Montag um 2:00 Uhr3. Verwendung von Intervallen anstelle von Cron
<?phpuse Scheduler\\Interval;
$scheduler->add(new Task('backup:db', 'mysqldump -u root db > backup.sql'), Interval::everyHour());// oder$scheduler->add(new Task('cleanup:logs', 'rm -rf /var/log/old/*'), Interval::everyDays(7));4. Verzögerte Ausführung über eine Warteschlange
<?php$scheduler->add(new Task('process:payments', function() use ($queue) { $queue->push(new