1. Vor dem Tutorial
Bitte lesen Sie zuerst die folgenden Abschnitte, um das relevante Wissen zu verstehen:
- Grundkonzepte von RabbitMQ
- Prinzip des RabbitMQ-Themenmusters
- PHP RabbitMQ Schnellstartkapitel (erforderlich, da in den folgenden Kapiteln der Code nicht dupliziert wird, sondern nur der Schlüsselcode angezeigt wird)
- PHP RabbitMQ Publish/Subscribe-Musterkapitel (erforderlich, da der Code fast identisch ist, nur der Austauschtyp und die Routing-Parameter unterschiedlich sind)
2. Thema-Austausch definieren
// Austausch deklarieren
$channel->exchange_declare(
'tizi365.topic', // Austauschname, muss eindeutig sein, darf nicht wiederholt werden
'topic', // Austauschtyp
false,
false, // Ob es dauerhaft ist
false
);
Hinweis: Sowohl Nachrichtenerzeuger als auch -empfänger benötigen Austausche.
3. Nachricht senden
Wir senden Nachrichten an den Austausch, und der Austausch liefert die Nachrichten basierend auf den Routing-Regeln an die entsprechende Warteschlange.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Eine RabbitMQ-Verbindung herstellen
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Kanal erstellen
$channel = $connection->channel();
// Austausch deklarieren
$channel->exchange_declare(
'tizi365.topic', // Austauschname, muss eindeutig sein, darf nicht wiederholt werden
'topic', // Austauschtyp
false,
false, // Ob es dauerhaft ist
false
);
// Nachrichtenobjekt, der Parameter ist der Nachrichteninhalt
$msg = new AMQPMessage("Hallo tizi365.com");
// Nachricht senden
// Beachten Sie den dritten Parameter, den Routing-Parameter
$channel->basic_publish(
$msg, // Nachrichtenobjekt
'tizi365.topic', // Austauschname
"www.tizi365.com" // Routing-Parameter, kann beliebig definiert werden
);
echo ' [x] Gesendet ', $msg->getBody(), "\n";
// Ressourcen freigeben
$channel->close();
$connection->close();
4. Nachrichten empfangen
4.1. Definition von Warteschlange & Binden von Exchange
Um Warteschlangennachrichten zu konsumieren, musst du zuerst eine Warteschlange definieren und sie dann an den Ziel-Exchange binden.
// Definiere eine anonyme Warteschlange
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// Binde die Warteschlange an den spezifizierten Exchange
$channel->queue_bind(
$queue_name, // Warteschlangenname
'tizi365.topic', // Exchange-Name
"*.tizi365.com" // Binde-Routing-Parameter, hier wird der Platzhalter * (Stern) verwendet, der ein einzelnes Wort übereinstimmen kann
Hinweis: Alle festgelegten Routing-Parameter verwenden das * (Stern) Platzhalterzeichen, das einem einzelnen Wort entsprechen kann. Wenn es auf # (Hashtag) geändert wird, kann es mehrere Wörter entsprechen.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// Erstelle eine RabbitMQ-Verbindung
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Erstelle einen Kanal
$channel = $connection->channel();
// Exchange deklarieren
$channel->exchange_declare(
'tizi365.topic', // Exchange-Name, muss eindeutig und nicht wiederholt sein
'topic', // Exchange-Typ
false,
false, // Ob es dauerhaft ist
false
);
// Definiere eine anonyme Warteschlange
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// Binde die Warteschlange an den spezifizierten Exchange
$channel->queue_bind(
$queue_name, // Warteschlangenname
'tizi365.topic', // Exchange-Name
"*.tizi365.com" // Binde-Routing-Schlüssel, der hier den Platzhalter * verwendet, um ein einzelnes Wort anzupassen
);
echo " [*] Warte auf Nachricht. Zum Beenden CTRL+C drücken\n";
// Definiere die Nachrichtenverarbeitungsfunktion (hier wird eine anonyme Funktion verwendet)
$callback = function ($msg) {
// Logik zur Nachrichtenverarbeitung
echo ' [x] ', $msg->body, "\n";
};
// Erstelle einen Konsumenten
$channel->basic_consume(
$queue_name, // Name der zu konsumierenden Warteschlange
'', // Konsumenten-Tag, wenn ignoriert, wird automatisch eine eindeutige ID generiert
false,
true, // Ob die Nachricht automatisch bestätigt werden soll, d. h. automatisch rabbitmq mitteilen, dass die Nachricht erfolgreich verarbeitet wurde
false,
false,
$callback // Nachrichtenverarbeitungsfunktion
);
// Wenn der Kanal nicht geschlossen ist, blockiere den Prozess, um das Beenden zu vermeiden
while ($channel->is_open()) {
$channel->wait();
}
// Ressourcen freigeben
$channel->close();
$connection->close();
Da der Routing-Parameter beim Binden des Exchanges auf *.tizi365.com festgelegt ist, passt er zum Routing-Parameter der Nachricht (www.tizi365.com), sodass die Nachricht empfangen werden kann.