حالت ساده‌ترین صف PHP RabbitMQ از یک تولید‌کننده و یک مصرف‌کننده تشکیل شده است، همانطور که در ساختار زیر نشان داده شده است. PHP RabbitMQ توضیح: P نمایانگر تولید‌کننده، C نمایانگر مصرف‌کننده و قرمز نمایانگر صف است.

در حال حاضر، وقتی با PHP RabbitMQ عمل می‌کنیم، بسته پیشنهادی توسط سایت رسمی php-amqplib است.

1. پیش‌آموزش

لطفا ابتدا بخش‌های زیر را مطالعه کنید تا دانش مربوطه را متوجه شوید:

2. نصب وابستگی‌های PHP

استفاده از composer برای نصب:

composer require php-amqplib/php-amqplib

توجه: آخرین نسخه php-amqplib نیازمند PHP 7.0 یا بالاتر است.

وارد‌کردن بسته php-amqplib:

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

3. ارسال پیام

3.1. ایجاد اتصال RabbitMQ

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

توضیح پارامترها:

  • new AMQPStreamConnection('آدرس سرور RabbitMQ', شماره پورت, 'نام کاربری', 'رمز عبور');

3.2. ایجاد کانال

$channel = $connection->channel();

بیشتر عملیات در کانال انجام می‌شود.

3.3. اعلام صف

$channel->queue_declare(
	'tizi365_hello',  // نام صف، باید یکتا باشد
	false,
	true, // آیا دوام‌دار است؟
	false,
	false
);

3.4. ارسال پیام

// تعریف یک شیء پیام، پارامتر آن محتوای پیامی است که می‌خواهیم ارسال کنیم
$msg = new AMQPMessage('Hello World!');
// آیا پیام دوام‌دار است؟
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);

// ارسال پیام
$channel->basic_publish(
		$msg, // شیء پیام
		'',   // انصراف از تبادل
		'tizi365_hello' // پارامتر مسیریابی، اینجا نام صف را به عنوان پارامتر مسیریابی استفاده می‌کنیم
	);

3.5. تکمیل کد ارسال پیام PHP

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

// ایجاد اتصال
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// ایجاد کانال
$channel = $connection->channel();
// اعلام صف
$channel->queue_declare('tizi365_hello', false, false, false, false);

// تعریف شیء پیام
$msg = new AMQPMessage('Hello World!');
// ارسال پیام
$channel->basic_publish($msg, '', 'tizi365_hello');

echo " [x] Sent 'Hello World!'\n";

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

ذخیره در فایل: send.php

۴. مصرف پیام‌ها

سه مرحله‌ی اول مصرف پیام‌ها (ایجاد ارتباط RabbitMQ، ایجاد یک کانال، اعلام یک صف) همانند ارسال پیام‌ها است، که به‌ترتیب متناظر با بخش‌های ۳.۱، ۳.۲ و ۳.۳ است.

کد کامل مصرف کننده به شرح زیر است:

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

// ایجاد ارتباط RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// ایجاد یک کانال
$channel = $connection->channel();

// اعلام یک صف
$channel->queue_declare('tizi365_hello', false, false, false, false);

echo " [*] در حال انتظار برای پیام‌ها. برای خروج کلید CTRL+C را فشار دهید\n";

// تعریف تابع کنترل پیام (اینجا از یک تابع ناشناس استفاده شده)
$callback = function ($msg) {
    // منطق کنترل پیام
    echo ' [x] دریافت شد ', $msg->body, "\n";
};

// ایجاد یک مصرف‌کننده
$channel->basic_consume(
    'tizi365_hello', // نام صف برای مصرف
    '', // برچسب مصرف‌کننده، اگر نادیده گرفته شود، یک شناسه یکتا ایجاد می‌شود
    false,
    true, // آیا به‌طور خودکار پیام را تأیید کند، یعنی به‌طور خودکار به RabbitMQ اعلام می‌کند که پیام با موفقیت پردازش شده است
    false,
    false,
    $callback // تابع کنترل پیام
);

// اگر کانال بسته نشده باشد، فرایند را مسدود نگه دارید تا از خروج جلوگیری شود
while ($channel->is_open()) {
    $channel->wait();
}

// گشایش منابع
$channel->close();
$connection->close();

ذخیره در فایل: recv.php

۵. اجرای دمو

دو پنجره ترمینال باز کنید و دو اسکریپت را به طور جداگانه اجرا کنید:

php recv.php

php send.php