Najprostszy tryb kolejki PHP RabbitMQ składa się z producenta i konsumenta, jak pokazano na poniższej architekturze. PHP RabbitMQ Wyjaśnienie: P reprezentuje producenta, C reprezentuje konsumenta, a czerwony kolor reprezentuje kolejkę.

Obecnie, przy operowaniu na RabbitMQ z użyciem PHP, zalecanym pakietem według oficjalnej dokumentacji jest php-amqplib.

1. Wstępny samouczek

Proszę najpierw przeczytać poniższe sekcje, aby zrozumieć odpowiednią wiedzę:

2. Instalacja zależności PHP

Użyj composera, aby zainstalować:

composer require php-amqplib/php-amqplib

Uwaga: Najnowsza wersja php-amqplib wymaga PHP 7.0 lub nowszej.

Zaimportuj pakiet php-amqplib:

require_once __DIR__ . '/vendor/autoload.php';

3. Wysłanie wiadomości

3.1. Utwórz połączenie RabbitMQ

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

Wyjaśnienie parametrów:

  • new AMQPStreamConnection('adres serwera RabbitMQ', numer portu, 'nazwa użytkownika', 'hasło');

3.2. Utwórz kanał

$channel = $connection->channel();

Większość operacji jest wykonywana w kanale.

3.3. Zadeklaruj kolejkę

$channel->queue_declare(
	'tizi365_hello',  // Nazwa kolejki, musi być unikalna
	false,
	true, // Czy jest trwała
	false,
	false
);

3.4. Wyślij wiadomość

// Zdefiniuj obiekt wiadomości, parametrem jest treść wiadomości, którą chcemy wysłać
$msg = new AMQPMessage('Witaj, świecie!');
// Czy wiadomość jest trwała
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);

// Wyślij wiadomość
$channel->basic_publish(
		$msg, // Obiekt wiadomości
		'',   // Zignoruj wymianę
		'tizi365_hello' // Parametr routingu, tutaj używamy nazwy kolejki jako parametru routingu
	);

3.5. Ukończ kod wysyłania wiadomości w PHP

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

// Utwórz połączenie
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Utwórz kanał
$channel = $connection->channel();
// Zadeklaruj kolejkę
$channel->queue_declare('tizi365_hello', false, false, false, false);

// Zdefiniuj obiekt wiadomości
$msg = new AMQPMessage('Witaj, świecie!');
// Wyślij wiadomość
$channel->basic_publish($msg, '', 'tizi365_hello');

echo " [x] Sent 'Witaj, świecie!'\n";

$channel->close();
$connection->close();

Zapisz do pliku: send.php

4. Konsumowanie wiadomości

Pierwsze trzy kroki konsumowania wiadomości (tworzenie połączenia z RabbitMQ, tworzenie kanału, deklarowanie kolejki) są takie same jak wysyłanie wiadomości, odpowiadające sekcjom 3.1, 3.2 i 3.3, odpowiednio.

Cały kod konsumenta wygląda następująco:

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

// Utwórz połączenie z RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Utwórz kanał
$channel = $connection->channel();

// Zadeklaruj kolejkę
$channel->queue_declare('tizi365_hello', false, false, false, false);

echo " [*] Oczekiwanie na wiadomości. Aby zakończyć, naciśnij CTRL+C\n";

// Zdefiniuj funkcję obsługi wiadomości (używamy tutaj funkcji anonimowej)
$callback = function ($msg) {
    // Logika obsługi wiadomości
    echo ' [x] Otrzymano ', $msg->body, "\n";
};

// Utwórz konsumenta
$channel->basic_consume(
    'tizi365_hello', // Nazwa kolejki do konsumpcji
    '', // Etykieta konsumenta, jeśli pominięta, generowany jest unikalny identyfikator
    false,
    true, // Czy automatycznie potwierdzać otrzymanie wiadomości, czyli automatycznie informować RabbitMQ, że wiadomość została pomyślnie przetworzona
    false,
    false,
    $callback // Funkcja obsługi wiadomości
);

// Jeśli kanał nie jest zamknięty, utrzymuj proces zablokowany, aby zapobiec zakończeniu
while ($channel->is_open()) {
    $channel->wait();
}

// Zwolnij zasoby
$channel->close();
$connection->close();

Zapisz do pliku: recv.php

5. Uruchamianie demo

Otwórz dwie okna powłoki i wykonaj oddzielnie dwa skrypty:

php recv.php

php send.php