1. บทนำก่อนการฝึกอบรม
โปรดอ่านส่วนต่อไปนี้ก่อนเพื่อทำความเข้าใจความรู้ที่เกี่ยวข้อง
- แนวคิดพื้นฐาน RabbitMQ
- หลักการของรูปแบบหัวข้อ RabbitMQ
- บทนำการใช้งาน 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;
// สร้างการเชื่อมต่อ 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.1. กำหนดคิวและผูกการแลกเปลี่ยน (Queue & Bind Exchange)
เพื่อรับข้อความจากคิว คุณต้องกำหนดคิวก่อน แล้วจึงผูกคิวกับการแลกเปลี่ยนเป้าหมาย
// ประกาศคิวแบบอนุทรรศน์
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) ดังนั้นข้อความสามารถรับได้