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;

// إنشاء اتصال رابيت 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)، لذا يمكن استقبال الرسالة.