Aufgabenwarteschlangen für PHP: RabbitMQ, Gearman und PhpAmqpLib
In modernen Webanwendungen ist die Antwortgeschwindigkeit für den Benutzer von entscheidender Bedeutung. Langwierige Vorgänge (E-Mail-Versand, PDF-Generierung, Bildverarbeitung, Daten-Parsing) sollten den Hauptausführungs-Thread nicht blockieren. Die Lösung für dieses Problem sind Aufgabenwarteschlangen (job queues). Sie ermöglichen es, Hintergrundaufgaben an Worker zu delegieren, die asynchron arbeiten.
Im PHP-Ökosystem gibt es mehrere ausgereifte Lösungen zur Organisation von Warteschlangen. Wir betrachten drei Schlüsselwerkzeuge: PhpAmqpLib (Client für RabbitMQ), Gearman und natives RabbitMQ über sein AMQP-Protokoll.
Wozu braucht man Aufgabenwarteschlangen in PHP?
Ein typisches Szenario: Ein Benutzer registriert sich auf einer Website. Das System muss:
- Die Daten in der Datenbank speichern
- Eine Begrüßungs-E-Mail senden
- Einen PDF-Vertrag erstellen
- Eine Spam-Prüfung starten
Ohne Warteschlange wartet der Benutzer auf den Abschluss aller Vorgänge. Mit einer Warteschlange:
- Der Hauptprozess speichert die Daten und sendet die Aufgabe an die Warteschlange
- Der Benutzer erhält sofort die Antwort „Erfolgreich“
- Hintergrund-Worker verarbeiten die Aufgaben nacheinander
Dies verbessert die UX und die Systemstabilität.
1. RabbitMQ und PhpAmqpLib
RabbitMQ ist ein leistungsstarker Nachrichtenbroker, der das AMQP 0-9-1-Protokoll unterstützt. PhpAmqpLib ist eine reine PHP-Implementierung eines Clients für die Arbeit mit RabbitMQ ohne externe Erweiterungen.
Installation
composer require php-amqplib/php-amqplibBeispiel: Aufgabe senden (Producer)
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
// Warteschlange deklarieren (wird erstellt, falls nicht vorhanden)$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode([ 'to' => 'user@example.com', 'subject' => 'Begrüßung', 'body' => 'Willkommen!']);
$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);$channel->basic_publish($msg, '', 'email_queue');
echo " [x] Gesendet: $data";
$channel->close();$connection->close();Beispiel: Worker (Consumer)
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
echo " [*] Warte auf Aufgaben. Zum Beenden drücken Sie STRG+C";
$callback = function ($msg) { $data = json_decode($msg->body, true); // E-Mail-Versand simulieren echo " [x] Sende E-Mail an {$data['to']}: {$data['subject']}"; sleep(2); // Arbeit simulieren echo " [x] Fertig"; $msg->ack(); // Verarbeitungsbestätigung};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}Vorteile: Zuverlässigkeit, Unterstützung komplexer Routings (topics, headers), Nachrichtenpersistenz, Clustering.
Nachteile: Installation und Konfiguration eines RabbitMQ-Servers erforderlich (Erlang, Verwaltung über Web-Interface).
2. Gearman
Gearman ist ein System für verteilte Aufgaben. Es besteht aus drei Komponenten: Client (sendet Aufgaben), Worker (führt aus), Server (Dispatcher). Es arbeitet über ein binäres Protokoll.
Installation
Installieren Sie zuerst den Gearman-Server und die PHP-Erweiterung:
sudo apt-get install gearman-job-s Auch in der Bibliothek
CLI-Frameworks für PHP: Symfony Console und Laravel Zero – vollständiger Leitfaden
Generierung von QR-Codes in C++: Bibliothek QR-Code-generator
Mongoose Paginate JavaScript (Node.js): Komplettanleitung mit Beispielen