PHP-Aufgabenplaner: Cron-ähnlicher Warteschlangenmanager in PHP

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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


Nach 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>&1


Das 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 Minute


2. 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 Uhr


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

Empfehlungen