1. Pre-tutorial

Per comprendere le conoscenze rilevanti, si prega di leggere prima le seguenti sezioni:

2. Definire lo scambio di topic

// Dichiarare lo scambio
$channel->exchange_declare(
    'tizi365.topic', // Nome dello scambio, deve essere univoco, non può essere ripetuto
    'topic', // Tipo di scambio
    false,
    false, // Se è duraturo
    false
);

Nota: Sia i produttori di messaggi che i consumatori hanno bisogno degli scambi.

3. Inviare un messaggio

Inviare messaggi allo scambio e lo scambio consegnerà i messaggi alla coda corrispondente in base alle regole di instradamento.

<?php

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

// Crea una connessione RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Crea un canale
$channel = $connection->channel();

// Dichiarare lo scambio
$channel->exchange_declare(
    'tizi365.topic', // Nome dello scambio, deve essere univoco, non può essere ripetuto
    'topic', // Tipo di scambio
    false,
    false, // Se è duraturo
    false
);

// Oggetto messaggio, il parametro è il contenuto del messaggio
$msg = new AMQPMessage("ciao tizi365.com");

// Invia il messaggio
// Nota il terzo parametro, il parametro di instradamento
$channel->basic_publish(
    $msg, // Oggetto messaggio
    'tizi365.topic', // Nome dello scambio
    "www.tizi365.com" // Parametro di instradamento, può essere definito arbitrariamente secondo i requisiti
);

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

// Rilascia le risorse
$channel->close();
$connection->close();

4. Ricevere un messaggio

4.1. Definire Coda e Collegare lo Scambio

Per consumare i messaggi in coda, è necessario prima definire una coda e poi collegarla allo scambio di destinazione.

// Definire una coda anonima
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Collegare la coda allo scambio specificato
$channel->queue_bind(
    $queue_name, // Nome della coda
    'tizi365.topic', // Nome dello scambio
    "*.tizi365.com" // Parametro di collegamento, qui viene utilizzato il carattere jolly * (asterisco), che corrisponde a una singola parola

Nota: Tutti i parametri di collegamento utilizzano il carattere jolly * (asterisco), che corrisponde a una singola parola. Se modificato in # (cancelletto), può corrispondere a più parole.

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

// Creare una connessione rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Creare un canale
$channel = $connection->channel();

// Dichiarare uno scambio
$channel->exchange_declare(
    'tizi365.topic', // Nome dello scambio, deve essere unico e non può essere ripetuto
    'topic', // Tipo di scambio
    false,
    false, // Se è duraturo
    false
);

// Definire una coda anonima
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Collegare la coda allo scambio specificato
$channel->queue_bind(
    $queue_name, // Nome della coda
    'tizi365.topic', // Nome dello scambio
    "*.tizi365.com" // Chiave di collegamento, qui viene utilizzato il carattere jolly * per corrispondere a una singola parola
);

echo " [*] In attesa di un messaggio. Premi CTRL+C per uscire\n";

// Definire la funzione di gestione messaggi (qui viene utilizzata una funzione anonima)
$callback = function ($msg) {
    // Logica di elaborazione del messaggio
    echo ' [x] ', $msg->body, "\n";
};

// Creare un consumatore
$channel->basic_consume(
    $queue_name, // Nome della coda da consumare
    '', // Tag del consumatore, se viene ignorato, verrà generato automaticamente un ID univoco
    false,
    true, // Se confermare automaticamente il messaggio, ovvero informare automaticamente rabbitmq che il messaggio è stato elaborato correttamente
    false,
    false,
    $callback // Funzione di gestione dei messaggi
);

// Se il canale non è chiuso, continua a bloccare il processo per evitare l'uscita del processo
while ($channel->is_open()) {
    $channel->wait();
}

// Rilasciare le risorse
$channel->close();
$connection->close();

Poiché il parametro di routing impostato durante il collegamento dello scambio è *.tizi365.com, corrisponde al parametro di routing del messaggio (www.tizi365.com), quindi il messaggio può essere ricevuto.