โหมดคิวที่ง่ายที่สุดของ PHP RabbitMQ ประกอบด้วยผู้ผลิต (producer) และผู้บริโภค (consumer) ตามที่แสดงในโครงสร้างด้านล่าง
คำอธิบาย:
P แทนผู้ผลิต, C แทนผู้บริโภค, และสีแดงแทนคิว (queue)
ณ ตอนนี้เมื่อดำเนินการกับ RabbitMQ ด้วย PHP, แพ็กเกจที่แนะนำโดยทางชาวบ้านคือ php-amqplib.
1. การเตรียมทึนโหมดก่อน
โปรดอ่านส่วนต่อไปนี้ก่อนเพื่อที่จะเข้าใจความรู้ที่เกี่ยวข้อง:
2. ติดตั้ง PHP dependencies
ใช้ composer เพื่อติดตั้ง:
composer require php-amqplib/php-amqplib
หมายเหตุ: เวอร์ชันล่าสุดของ php-amqplib ต้องการ PHP 7.0 หรือสูงกว่า.
นำเข้าแพ็กเกจ php-amqplib:
require_once __DIR__ . '/vendor/autoload.php';
3. ส่งข้อความ
3.1. สร้างการเชื่อมต่อกับ RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
คำอธิบายพารามิเตอร์:
- new AMQPStreamConnection('ที่อยู่เซิร์ฟเวอร์ RabbitMQ', หมายเลขพอร์ต, 'ชื่อผู้ใช้', 'รหัสผ่าน');
3.2. สร้างช่อง (Channel)
$channel = $connection->channel();
การดำเนินการส่วนใหญ่จะเสร็จสมบูรณ์ในช่อง.
3.3. ประกาศคิว (Queue)
$channel->queue_declare(
'tizi365_hello', // ชื่อคิว, จะต้องเป็นที่สมบูรณ์
false,
true, // ว่ามันทนที่หรือไม่
false,
false
);
3.4. ผPush ข้อความ
// กำหนดอ็อบเจ็กต์ข้อความ, พารามิเตอร์คือเนื้อหาข้อความที่เราต้องการส่ง
$msg = new AMQPMessage('Hello World!');
// ว่าข้อความนั้นทนที่หรือไม่
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);
// ส่งข้อความ
$channel->basic_publish(
$msg, // อ็อบเจ็กต์ข้อความ
'', // ละเว้นแลกเชน
'tizi365_hello' // พารามิเตอร์การเดินเรือ, ใช้ชื่อคิวเป็นพารามิเตอร์การเดินเรือที่นี่
);
3.5. รหัสสมบูรณ์ในการส่งข้อความด้วย PHP
<?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->queue_declare('tizi365_hello', false, false, false, false);
// กำหนดอ็อบเจ็กต์ข้อความ
$msg = new AMQPMessage('Hello World!');
// ส่งข้อความ
$channel->basic_publish($msg, '', 'tizi365_hello');
echo " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
บันทึกลงในไฟล์: send.php
4. การรับข้อความ
ขั้นตอนสามขั้นตอนแรกของการรับข้อความ (การสร้างการเชื่อมต่อกับ RabbitMQ, การสร้างช่องสื่อสาร, การประกาศคิว) เหมือนกับการส่งข้อความ ที่สอดคล้องกับส่วน 3.1, 3.2, และ 3.3 ตามลำดับ
โค้ดของผู้บริโภคที่สมบูรณ์คือดังนี้:
<?php require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// สร้างการเชื่อมต่อกับ RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// สร้างช่องสื่อสาร
$channel = $connection->channel();
// ประกาศคิว
$channel->queue_declare('tizi365_hello', false, false, false, false);
echo " [*] กำลังรอข้อความ หากต้องการออก ให้กด CTRL+C\n";
// กำหนดฟังก์ชันการจัดการข้อความ (ใช้ฟังก์ชันไม่ตั้งชื่ออย่างไรที่นี่)
$callback = function ($msg) {
// ตรรกะการจัดการข้อความ
echo ' [x] ได้รับ ', $msg->body, "\n";
};
// สร้างผู้บริโภค
$channel->basic_consume(
'tizi365_hello', // ชื่อคิวที่ต้องการที่จะใช้
'', // แท็กของผู้บริโภค, หากไม่ต้องการให้กำหนด ระบบจะสร้าง ID ที่ไม่ซ้ำให้
false,
true, // ว่าจะยอมรับข้อความโดยอัตโนมัติหรือไม่ กล่าวคือ บอก RabbitMQ โดยอัตโนมัติว่าข้อความถูกประมวลผลเรียบร้อยแล้ว
false,
false,
$callback // ฟังก์ชันการจัดการข้อความ
);
// หากช่องสื่อสารยังไม่ถูกปิด ให้ใช้การดำเนินการบล็อคเพื่อป้องกันไม่ให้ส่งออก
while ($channel->is_open()) {
$channel->wait();
}
// ปลดทรัพยากร
$channel->close();
$connection->close();
บันทึกลงในไฟล์: recv.php
5. การเรียกใช้งานตัวอย่าง
เปิดหน้าต่าง shell สองหน้าต่างและเรียกใช้สคริปต์สองตัวโดยแยกกัน:
php recv.php
php send.php