PHP ریبٹ ایمکیو (RabbitMQ) ریوٹنگ موڈ (ڈائریکٹ موڈ)

ریبٹ ایمکیو کے ریوٹنگ موڈ میں، استعمال ہونے والے ایکسچینج کی قسم "ڈائریکٹ" ہوتی ہے۔ پبلش-سبسکرائب موڈ سے بڑھ کر، ڈائریکٹ ایکسچینج وہ میسجز کو قیووں تک پہنچاتا ہے جن کے راوٹنگ پیرامیٹر مکمل ملتے ہیں۔ ایسی تعمیر نیچے دی گئی چارٹ میں دکھائی گئی ہے:

RabbitMQ ڈائریکٹ موڈ

نوٹ: ریبٹ ایمکیو میں استعمال کرنے والے موڈ کی نوعیت اور راوٹنگ پیرامیٹرس میں فرق ہوتا ہے، باقی کاموں میں کوئی فرق نہیں ہوتا۔

1. تیاری کا تعلق رکھنے والی ٹیوٹوریل

براہ کرم متعلقہ علم سمجھنے کے لئے پہلے مندرجہ ذیل سیکشنز کو پڑھیں:

2. ڈائریکٹ ایکسچینج کی تعریف کریں

// ایکسچینج کا اعلان کریں
$channel->exchange_declare(
    'tizi365.direct', // یونیک ایکسچینج نام
    'direct', // ایکسچینج کی قسم
    false,
    false, // کیا مضمون کو قائم رکھنا ہے
    false
);

نوٹ: میسج پیدا کنندگان اور مصنوعات دونوں کو ایکسچینج کی ضرورت ہوتی ہے۔

3. پیغامات بھیجنا

ہم پیغامات کو ایکسچینج کو بھیجتے ہیں، اور ایکسچینج راوٹنگ کے قواعد پر مبنی قوقوں کو میسج بھیجتا ہے۔

<?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->exchange_declare(
    'tizi365.direct', // یونیک ایکسچینج نام
    'direct', // ایکسچینج کی قسم
    false,
    false, // کیا مضمون کو قائم رکھنا ہے
    false
);

// پیغام کا شعور، میسج مضمون پیرامیٹر ہوتا ہے
$msg = new AMQPMessage("ہیلو tizi365.com");

// تیسرے پیرامیٹر پر توجہ دیں، راوٹنگ پیرامیٹر
$channel->basic_publish(
    $msg, // پیغام شعور
    'tizi365.direct', // ایکسچینج نام
    "tizi365" // راوٹنگ پیرامیٹر، ضرورت کے مطابق منتخب کرسکتے ہیں
);

echo ' [x] بھیجا گیا ', $msg->getBody(), "\n";

// وسائل کو رہا کریں
$channel->close();
$connection->close();

نوٹ: basic_publish میں تیسرا پیرامیٹر ایک کلیدی پیرامیٹر ہے۔

4. پیغامات کے وصول کرنا

4.1. قطار تعریف کریں اور ایکسچینج سے بائنڈ کریں

قطار کے پیغامات کو استعمال کرنے کے لئے ، پہلے آپ کو ایک قطار کی تعریف کرنی ہوگی اور پھر اس قطار کو ہدف ایکسچینج سے بائنڈ کرنا ہوگا۔

// ایک انامی قطار کا اعلان کریں
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// قطار کو مخصوص ایکسچینج سے بائنڈ کریں
$channel->queue_bind(
    $queue_name, // قطار کا نام
    'tizi365.fanout', // ایکسچینج کا نام
    "tizi365" // بائنڈ روٹنگ پیرامیٹر ، یہاں 'tizi365' بائنڈ کریں
);

نوٹ: درست ایکسچینج کے قواعد کے مطابقت کے مطابق ، اگر پیغام بھیجتے وقت روٹنگ پیرامیٹر جوڑتے وقت جوڑے گئے ہوں ، تو پیغام اس قطار کو پہنچایا جائے گا۔

<?php

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

// ایک رابطہ مقرر کریں
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// ایک چینل بنائیں
$channel = $connection->channel();

// ایک ایکسچینج کا اعلان کریں
$channel->exchange_declare(
    'tizi365.direct', // ایکسچینج کا نام ، یہ منفرد ہونا چاہئے اور دہرایا نہیں جا سکتا
    'direct', // ایکسچینج کی قسم
    false,
    false, // کیا یہ دائمی ہے یا نہیں ہے
    false
);

// ایک انامی قطار کا اعلان کریں
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// قطار کو ایک مخصوص ایکسچینج سے بائنڈ کریں
$channel->queue_bind(
    $queue_name, // قطار کا نام
    'tizi365.fanout', // ایکسچینج کا نام
    "tizi365" // بائنڈ روٹنگ پیرامیٹر ، یہاں 'tizi365' بائنڈ کریں
);

echo " [*] پیغام کا منتظر ہوں۔ باہر نکلنے کے لئے CTRL+C دبائیں\n";

// پیغام کا منظرعلیقیت تعین کرنے والا فنکشن (یہاں ایک انامی فنکشن کا استعمال ہے)
$callback = function ($msg) {
    // پیغام کا منظرعلیقیت منظم کرنے کی منطق
    echo ' [x] ', $msg->body, "\n";
};

// ایک کنسیومر بنائیں
$channel->basic_consume(
    $queue_name, // قطار کا نام ، براہ کرم اس قطار کا نام جو منظور ہونا چاہئے
    '', // کنسیومر ٹیگ ، نظرانداز ، خودبخود ایک یونیک شناختی نمبر بنایا جاتا ہے
    false,
    true, // کیا پیغام کو خودبخود تسلیم کرنا ہے یعنی خبردار کرنا ہے کہ پیغام کامیابی سے پراکرمت ہوگیا ہے
    false,
    false,
    $callback // پیغام کا منظرعلیقیت فنکشن
);

// پروسیس بلاک ہونے تک تھامیں ، چینل بند نہیں ہونے دیں تاکہ پروسیس مکمل نہ ہو جائے
while ($channel->is_open()) {
    $channel->wait();
}

// وسائل کو آزاد کریں
$channel->close();
$connection->close();