Il modo più semplice di coda di PHP RabbitMQ è composto da un produttore e un consumatore, come mostrato nell'architettura qui sotto.
Spiegazione:
P rappresenta il produttore, C rappresenta il consumatore e il rosso rappresenta la coda.
Attualmente, quando si opera con RabbitMQ in PHP, il pacchetto consigliato ufficialmente è php-amqplib.
1. Pre-tutorial
Si prega di leggere prima le seguenti sezioni per comprendere le conoscenze rilevanti:
2. Installare le dipendenze di PHP
Usa composer per installare:
composer require php-amqplib/php-amqplib
Nota: La versione più recente di php-amqplib richiede PHP 7.0 o superiore.
Importa il pacchetto php-amqplib:
require_once __DIR__ . '/vendor/autoload.php';
3. Invia messaggio
3.1. Creare connessione RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
Spiegazione dei parametri:
- new AMQPStreamConnection('indirizzo del server RabbitMQ', numero di porta, 'nome utente', 'password');
3.2. Creare un canale
$channel = $connection->channel();
La maggior parte delle operazioni viene completata nel canale.
3.3. Dichiarare coda
$channel->queue_declare(
'tizi365_hello', // Nome della coda, deve essere univoco
false,
true, // Se è duraturo
false,
false
);
3.4. Inoltrare il messaggio
// Definire un oggetto messaggio, il parametro è il contenuto del messaggio che dobbiamo inviare
$msg = new AMQPMessage('Ciao Mondo!');
// Se il messaggio è duraturo
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);
// Invia il messaggio
$channel->basic_publish(
$msg, // Oggetto messaggio
'', // Ignora lo scambio
'tizi365_hello' // Parametro di instradamento, usa il nome della coda come parametro di instradamento qui
);
3.5. Completa il codice di invio messaggio PHP
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Crea connessione
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Crea canale
$channel = $connection->channel();
// Dichiarare coda
$channel->queue_declare('tizi365_hello', false, false, false, false);
// Definire oggetto messaggio
$msg = new AMQPMessage('Ciao Mondo!');
// Invia messaggio
$channel->basic_publish($msg, '', 'tizi365_hello');
echo " [x] Sent 'Ciao Mondo!'\n";
$channel->close();
$connection->close();
Salva nel file: send.php
4. Consumo dei messaggi
I primi tre passaggi del consumo dei messaggi (creazione di una connessione RabbitMQ, creazione di un canale, dichiarazione di una coda) sono gli stessi dell'invio dei messaggi, corrispondenti alle sezioni 3.1, 3.2 e 3.3, rispettivamente.
Il codice completo del consumatore è il seguente:
<?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 una coda
$channel->queue_declare('tizi365_hello', false, false, false, false);
echo " [*] In attesa di messaggi. Premere CTRL+C per uscire\n";
// Definire la funzione di gestione dei messaggi (si utilizza qui una funzione anonima)
$callback = function ($msg) {
// Logica di gestione dei messaggi
echo ' [x] Ricevuto ', $msg->body, "\n";
};
// Creare un consumatore
$channel->basic_consume(
'tizi365_hello', // Nome della coda da consumare
'', // Tag del consumatore, se ignorato viene generato un ID univoco
false,
true, // Se automaticamente riconoscere il messaggio, ossia informare automaticamente RabbitMQ che il messaggio è stato elaborato con successo
false,
false,
$callback // Funzione di gestione dei messaggi
);
// Se il canale non è chiuso, mantenere il processo bloccato per evitare che esca
while ($channel->is_open()) {
$channel->wait();
}
// Rilasciare le risorse
$channel->close();
$connection->close();
Salvare nel file: recv.php
5. Eseguire la demo
Aprire due finestre di shell ed eseguire separatamente i due script:
php recv.php
php send.php