1. Vor dem Tutorial

Bitte lesen Sie zuerst die folgenden Abschnitte, um das relevante Wissen zu verstehen:

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.