1. قبل از آموزش

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

2. تعریف تبادل موضوعی

// اعلان تبادل
$channel->exchange_declare(
    'tizi365.topic', // نام تبادل، باید یکتا باشد و نمی‌تواند تکراری باشد
    'topic', // نوع تبادل
    false,
    false, // آیا دائمی است یا خیر
    false
);

توجه: هر دو تولید کننده و مصرف کننده پیام‌ها نیاز به تبادل دارند.

3. ارسال پیام

ما پیام‌ها را به تبادل ارسال می‌کنیم و تبادل پیام‌ها را براساس قوانین مسیریابی به صف مربوطه ارسال می‌کند.

<?php

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

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

// اعلان تبادل
$channel->exchange_declare(
    'tizi365.topic', // نام تبادل، باید یکتا باشد و نمی‌تواند تکراری باشد
    'topic', // نوع تبادل
    false,
    false, // آیا دائمی است یا خیر
    false
);

// شیء پیام، پارامتر محتوای پیام است
$msg = new AMQPMessage("hello tizi365.com");

// ارسال پیام
// توجه: پارامتر سوم، پارامتر مسیریابی است
$channel->basic_publish(
    $msg, // شیء پیام
    'tizi365.topic', // نام تبادل
    "www.tizi365.com" // پارامتر مسیریابی، می‌تواند براساس نیاز به دلخواه تعریف شود
);

echo ' [x] Sent ', $msg->getBody(), "\n";

// آزادسازی منابع
$channel->close();
$connection->close();

4. دریافت پیام

۴.۱. تعریف صف و متصل سازی تبادل

برای مصرف پیام‌های صف، ابتدا باید یک صف تعریف کنید و سپس آن را به تبادل مورد نظر متصل کنید.

// یک صف ناشناس تعریف کنید
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// صف را به تبادل مشخص متصل کنید
$channel->queue_bind(
    $queue_name, // نام صف
    'tizi365.topic', // نام تبادل
    "*.tizi365.com" // پارامتر متصل کردن روتینگ، اینجا از علامت * (ستاره) استفاده می‌شود که می‌تواند یک کلمه را مطابقت دهد

توجه: تمام پارامترهای روتینگ تنظیم شده از علامت * (ستاره) واقعی است، که می‌تواند یک کلمه را مطابقت دهد. اگر به # (هشتاگ) تغییر یابد، می‌تواند چند کلمه را مطابقت دهد.

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

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

// تعریف یک تبادل
$channel->exchange_declare(
    'tizi365.topic', // نام تبادل، باید یکتا و قابل تکرار نباشد
    'topic', // نوع تبادل
    false,
    false, // آیا دائمی است
    false
);

// صف ناشناس را تعریف کنید
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// صف را به تبادل مورد نظر متصل کنید
$channel->queue_bind(
    $queue_name, // نام صف برای مصرف
    'tizi365.topic', // نام تبادل
    "*.tizi365.com" // کلید روتینگ متصل‌سازی، اینجا از علامت * استفاده می‌شود که می‌تواند یک کلمه را مطابقت دهد
);

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

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

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

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

// آزادسازی منابع
$channel->close();
$connection->close();

زیرا پارامتر روتینگ تنظیم شده هنگام متصل کردن تبادل *.tizi365.com است، با پارامتر روتینگ پیام (www.tizi365.com) مطابقت دارد، بنابراین پیام قابل دریافت است.