1. Pre-tutorial
Per comprendere le conoscenze rilevanti, si prega di leggere prima le seguenti sezioni:
- Concetti di base di RabbitMQ
- Principio del modello di topic di RabbitMQ
- Capitolo di avvio rapido di RabbitMQ per PHP (necessario, poiché i capitoli successivi non duplicheranno il codice, mostreranno solo il codice chiave)
- Capitolo del modello di pubblicazione/sottoscrizione di RabbitMQ per PHP (necessario, poiché il codice è quasi lo stesso, solo il tipo di scambio e i parametri di instradamento sono diversi)
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.