1. قبل الدرس
يرجى قراءة الأقسام التالية أولاً لفهم المعرفة ذات الصلة
- مفاهيم أساسية حول RabbitMQ
- مبدأ نمط العمل لـ RabbitMQ Topic
- فصل بداية سريع لـ RabbitMQ في PHP (مطلوب، لأن الفصول التالية لن تكرر الشفرة، ستعرض فقط الشفرة الرئيسية)
- فصل نمط النشر/الاشتراك لـ RabbitMQ في PHP (مطلوب، لأن الشفرة تكاد تكون متطابقة، فقط نوع التبادل ومعلمات التوجيه هي الفرق)
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;
// إنشاء اتصال رابيت MQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// إنشاء قناة
$channel = $connection->channel();
// أعلن التبادل
$channel->exchange_declare(
'tizi365.topic', // اسم التبادل، يجب أن يكون فريدًا، ولا يمكن تكراره
'topic', // نوع التبادل
false,
false, // ما إذا كان صامدًا
false
);
// كائن الرسالة، القيمة المعلمة هي محتوى الرسالة
$msg = new AMQPMessage("مرحبا tizi365.com");
// إرسال الرسالة
// لاحظ المعلمة الثالثة، معلمة التوجيه
$channel->basic_publish(
$msg, // كائن الرسالة
'tizi365.topic', // اسم التبادل
"www.tizi365.com" // معلمة التوجيه، يمكن تعريفها بشكل تطوعي وفقًا للمتطلبات
);
echo ' [x] Sent ', $msg->getBody(), "\n";
// إطلاق الموارد
$channel->close();
$connection->close();
4. استقبال الرسالة
4.1.تعريف الصفّ وربط الصرف
لتناول رسائل الصف، يجب أن تقوم أولاً بتعريف الصف، ومن ثم ربط الصف بالصرف المستهدف.
// قم بتعريف صف مجهول
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 يعترف تلقائيًا بالرسالة، أي يقول تلقائيًا لـ rabbitmq أن الرسالة تمت معالجتها بنجاح
false,
false,
$callback // وظيفة معالجة الرسالة
);
// إذا لم يتم إغلاق القناة، فاستمر في حظر العملية لتجنب إغلاق العملية
while ($channel->is_open()) {
$channel->wait();
}
// إطلاق الموارد
$channel->close();
$connection->close();
نظرًا لأن معلمة الربط التي تم تعيينها عند ربط الصرف هي *.tizi365.com، فإنها تتطابق مع معلمة الربط للرسالة (www.tizi365.com)، لذا يمكن استقبال الرسالة.