1. قبل از آموزش
لطفاً ابتدا بخشهای زیر را مطالعه کنید تا به دانش مربوطه آشنا شوید
- مفاهیم اصلی RabbitMQ
- اصل الگوی موضوعی RabbitMQ
- فصل شروع سریع PHP RabbitMQ (لازم است، زیرا فصلهای بعدی کد را تکرار نمیکنند، فقط کد کلیدی را نشان میدهند)
- فصل الگوی انتشار/اشتراک PHP RabbitMQ (لازم است، زیرا کد تقریباً یکسان است، تنها نوع تبادل و پارامترهای مسیریابی متفاوت هستند)
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) مطابقت دارد، بنابراین پیام قابل دریافت است.