Chế độ hàng đợi đơn giản nhất của PHP RabbitMQ bao gồm một người sản xuất và một người tiêu dùng, như được hiển thị trong kiến trúc dưới đây. PHP RabbitMQ Giải thích: P đại diện cho người sản xuất, C đại diện cho người tiêu dùng, và màu đỏ đại diện cho hàng đợi.

Hiện tại, khi vận hành RabbitMQ với PHP, gói được đề xuất bởi trang chính thức là php-amqplib.

1. Trước khi hướng dẫn

Vui lòng đọc các phần sau đây trước để hiểu về kiến thức liên quan:

2. Cài đặt các phụ thuộc PHP

Sử dụng composer để cài đặt:

composer require php-amqplib/php-amqplib

Ghi chú: Phiên bản mới nhất của php-amqplib yêu cầu PHP 7.0 trở lên.

Nhập gói php-amqplib:

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

3. Gửi tin nhắn

3.1. Tạo kết nối RabbitMQ

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

Giải thích tham số:

  • new AMQPStreamConnection('địa chỉ máy chủ RabbitMQ', số cổng, 'tên người dùng', 'mật khẩu');

3.2. Tạo kênh

$channel = $connection->channel();

Hầu hết các hoạt động được thực hiện trên kênh.

3.3. Khai báo hàng đợi

$channel->queue_declare(
	'tizi365_hello',  // Tên hàng đợi, phải là duy nhất
	false,
	true, // Có bền không
	false,
	false
);

3.4. Đẩy tin nhắn

// Định nghĩa một đối tượng tin nhắn, tham số là nội dung tin nhắn chúng ta cần gửi
$msg = new AMQPMessage('Xin chào bạn!');
// Có tin nhắn có bền không
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);

// Gửi tin nhắn
$channel->basic_publish(
		$msg, // Đối tượng tin nhắn
		'',   // Bỏ qua trao đổi
		'tizi365_hello' // Tham số định tuyến, ở đây sử dụng tên hàng đợi làm tham số định tuyến
	);

3.5. Hoàn tất mã gửi tin nhắn PHP

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

// Tạo kết nối
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Tạo kênh
$channel = $connection->channel();
// Khai báo hàng đợi
$channel->queue_declare('tizi365_hello', false, false, false, false);

// Định nghĩa đối tượng tin nhắn
$msg = new AMQPMessage('Xin chào bạn!');
// Gửi tin nhắn
$channel->basic_publish($msg, '', 'tizi365_hello');

echo " [x] Sent 'Xin chào bạn!'\n";

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

Lưu vào tệp: send.php

4. Tiêu thụ Tin nhắn

Ba bước đầu tiên của việc tiêu thụ tin nhắn (tạo kết nối RabbitMQ, tạo kênh, khai báo một hàng đợi) giống như việc gửi tin nhắn, tương ứng với các phần 3.1, 3.2 và 3.3, tương ứng.

Mã tiêu thụ đầy đủ như sau:

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

// Tạo kết nối RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Tạo một kênh
$channel = $connection->channel();

// Khai báo một hàng đợi
$channel->queue_declare('tizi365_hello', false, false, false, false);

echo " [*] Đang chờ tin nhắn. Nhấn CTRL+C để thoát\n";

// Định nghĩa chức năng xử lý tin nhắn (sử dụng hàm ẩn danh tại đây)
$callback = function ($msg) {
    // Logic xử lý tin nhắn
    echo ' [x] Nhận được ', $msg->body, "\n";
};

// Tạo một tiêu thụ
$channel->basic_consume(
    'tizi365_hello', // Tên hàng đợi cần tiêu thụ
    '', // Thẻ tiêu thụ, nếu bị bỏ qua, một ID duy nhất sẽ được tạo ra
    false,
    true, // Có tự động xác nhận tin nhắn hay không, tức là tự động thông báo cho RabbitMQ rằng tin nhắn đã được xử lý thành công
    false,
    false,
    $callback // Chức năng xử lý tin nhắn
);

// Nếu kênh không bị đóng, giữ quá trình bị chặn để ngăn nó thoát
while ($channel->is_open()) {
    $channel->wait();
}

// Giải phóng tài nguyên
$channel->close();
$connection->close();

Lưu vào tập tin: recv.php

5. Chạy Demo

Mở hai cửa sổ dòng lệnh và thực thi hai tập lệnh một cách riêng biệt:

php recv.php

php send.php