โหมดคิวที่ง่ายที่สุดของ PHP RabbitMQ ประกอบด้วยผู้ผลิต (producer) และผู้บริโภค (consumer) ตามที่แสดงในโครงสร้างด้านล่าง PHP RabbitMQ คำอธิบาย: 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