Aufgabenwarteschlangen für PHP: RabbitMQ, Beanstalkd und Gearman
In modernen Webanwendungen besteht häufig die Notwendigkeit, langwierige oder ressourcenintensive Operationen asynchron auszuführen, ohne den Benutzer auf eine Antwort warten zu lassen. Typische Beispiele: Versand von E-Mail-Newslettern, Berichtserstellung, Bildverarbeitung, Interaktion mit externen APIs. Zur Lösung dieser Aufgaben werden in PHP Aufgabenwarteschlangen (Job Queues) verwendet. Sie ermöglichen es, die Anfragelogik von der Hintergrundverarbeitung zu trennen, wodurch die Reaktionsfähigkeit der Benutzeroberfläche und die Skalierbarkeit des Systems verbessert werden.
In diesem Artikel betrachten wir drei beliebte Werkzeuge zur Organisation von Warteschlangen in PHP im Detail: RabbitMQ, Beanstalkd und Gearman. Sie erfahren mehr über ihre Besonderheiten, Architektur, Anwendungsbeispiele und lernen, die passende Lösung für Ihr Projekt auszuwählen.
1. RabbitMQ
RabbitMQ ist ein leistungsstarker Nachrichtenbroker, der das AMQP-Protokoll (Advanced Message Queuing Protocol) implementiert. Es unterstützt komplexe Routing-Szenarien, Exchanges, priorisierte Warteschlangen, Bestätigungen der Zustellung und vieles mehr. RabbitMQ eignet sich ideal für Microservice-Architekturen und Systeme, die eine zuverlässige Nachrichtenzustellung erfordern.
Installation und Einbindung
Für die Arbeit mit RabbitMQ in PHP wird die Bibliothek php-amqplib verwendet. Installation über Composer:
composer require php-amqplib/php-amqplibBeispiel: Senden einer E-Mail-Benachrichtigung
Wir erstellen einen Producer (Sender) und einen Consumer (Verarbeiter) für den Hintergrundversand von E-Mails.
Datei producer.php:
<?phprequire_once 'vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode([ 'email' => 'user@example.com', 'subject' => 'Willkommen!', 'body' => 'Vielen Dank für Ihre Registrierung.']);
$msg = new AMQPMessage($data, [ 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
echo " [x] Nachricht gesendet";
$channel->close();$connection->close();Datei consumer.php:
<?phprequire_once '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 Nachrichten. Drücken Sie STRG+C zum Beenden";
$callback = function ($msg) { $data = json_decode($msg->body, true); // Simulation des E-Mail-Versands sleep(2); echo " [x] E-Mail an {$data['email']} gesendet"; $msg->ack();};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}
$channel->close();$connection->close();2. Beanstalkd
Beanstalkd ist ein leichtgewichtiger, schneller und einfach zu bedienender Warteschlangen-Manager. Es arbeitet mit einem Protokoll, das memcached ähnelt, und eignet sich hervorragend für Aufgaben, die kein komplexes Routing erfordern. Beanstalkd unterstützt Prioritäten, Verzögerungen (Delay) und Time-to-Run (TTR).
Installation
Für PHP gibt es den Client pda/pheanstalk:
composer require pda/pheanstalkBeispiel: Bildverarbeitung
Angenommen, wir müssen Miniaturansichten für hochgeladene Bilder erstellen.
Datei producer.php:
<?phprequire_once 'v Auch in der Bibliothek
Arbeit mit XML in Kotlin: Bibliotheken und Werkzeuge für Parsing und Erstellung
Playwright JavaScript (Node.js): Komplettes Tutorial mit Beispielen
Ktor Client für Kotlin: Komplettguide mit Beispielen
Chronicle Map Java: Komplettleitfaden mit Beispielen
ORM für Rust: Vergleich von Diesel, SeaORM, SQLx und Codebeispiele