1. Avant le tutoriel

Veuillez lire les sections suivantes d'abord pour comprendre les connaissances pertinentes

2.Définir l'échange de sujet

// Déclarer l'échange
$channel->exchange_declare(
    'tizi365.topic', // Nom de l'échange, doit être unique, ne peut pas être répété
    'topic', // Type d'échange
    false,
    false, // S'il est durable
    false
);

Remarque : Les producteurs de messages et les consommateurs ont besoin d'échanges.

3.Envoyer un message

Nous envoyons des messages à l'échange, et l'échange les distribue à la file d'attente correspondante en fonction des règles de routage.

<?php

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// Créer une connexion rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Créer un canal
$channel = $connection->channel();

// Déclarer l'échange
$channel->exchange_declare(
    'tizi365.topic', // Nom de l'échange, doit être unique, ne peut pas être répété
    'topic', // Type d'échange
    false,
    false, // S'il est durable
    false
);

// Objet de message, le paramètre est le contenu du message
$msg = new AMQPMessage("bonjour tizi365.com");

// Envoyer le message
// Notez le troisième paramètre, le paramètre de routage
$channel->basic_publish(
    $msg, // Objet de message
    'tizi365.topic', // Nom de l'échange
    "www.tizi365.com" // Paramètre de routage, peut être défini arbitrairement selon les besoins
);

echo ' [x] Envoyé ', $msg->getBody(), "\n";

// Libérer les ressources
$channel->close();
$connection->close();

4. Recevoir un message

4.1. Définir la file d'attente et lier l'échange

Pour consommer les messages de la file d'attente, vous devez d'abord définir une file d'attente, puis lier la file d'attente à l'échange cible.

// Déclarer une file d'attente anonyme
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Lier la file d'attente à l'échange spécifié
$channel->queue_bind(
    $queue_name, // Nom de la file d'attente
    'tizi365.topic', // Nom de l'échange
    "*.tizi365.com" // Paramètre de routage de liaison, ici en utilisant le joker * (astérisque), qui peut correspondre à un seul mot

Remarque : Tous les paramètres de routage utilisent le joker * (astérisque), qui peut correspondre à un seul mot. S'ils sont modifiés en # (dièse), ils peuvent correspondre à plusieurs mots.

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

// Créer une connexion rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Créer un canal
$channel = $connection->channel();

// Déclarer un échange
$channel->exchange_declare(
    'tizi365.topic', // Nom de l'échange, doit être unique et ne peut pas être répété
    'topic', // Type d'échange
    false,
    false, // Qu'il soit durable
    false
);

// Déclarer une file d'attente anonyme
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Lier la file d'attente à l'échange spécifié
$channel->queue_bind(
    $queue_name, // Nom de la file d'attente
    'tizi365.topic', // Nom de l'échange
    "*.tizi365.com" // Clé de routage de liaison, en utilisant ici le joker * qui peut correspondre à un seul mot
);

echo " [*] En attente du message. Pour quitter, appuyez sur CTRL+C\n";

// Définir la fonction de traitement des messages (en utilisant une fonction anonyme ici)
$callback = function ($msg) {
    // Logique de traitement des messages
    echo ' [x] ', $msg->body, "\n";
};

// Créer un consommateur
$channel->basic_consume(
    $queue_name, // Nom de la file d'attente à consommer
    '', // Tag du consommateur, s'il est ignoré, un ID unique sera généré automatiquement
    false,
    true, // S'il faut automatiquement reconnaître le message, c'est-à-dire dire automatiquement à rabbitmq que le message a été traité avec succès
    false,
    false,
    $callback // Fonction de traitement des messages
);

// Si le canal n'est pas fermé, bloquez le processus pour éviter la sortie du processus
while ($channel->is_open()) {
    $channel->wait();
}

// Libérer les ressources
$channel->close();
$connection->close();

Étant donné que le paramètre de routage défini lors de la liaison de l'échange est *.tizi365.com, il correspond au paramètre de routage du message (www.tizi365.com), donc le message peut être reçu.