คิว Stomp
Stomp เป็นโปรโตคอลข้อความแบบข้อความง่าย (สตรีมมิง) ที่ให้รูปแบบการเชื่อมต่อที่ทำงานร่วมกันได้ ทำให้ไคลเอนต์ STOMP สามารถสื่อสารกับโบรกเกอร์ข้อความ STOMP ใดๆ ได้ workerman/stomp เป็นการ implement ไคลเอนต์ Stomp ใช้หลักในสถานการณ์คิวข้อความ เช่น RabbitMQ, Apollo, ActiveMQ เป็นต้น
การติดตั้ง
composer require webman/stomp
การกำหนดค่า
ไฟล์กำหนดค่าอยู่ที่ config/plugin/webman/stomp
การส่งข้อความ
<?php
namespace app\controller;
use support\Request;
use Webman\Stomp\Client;
class Index
{
public function queue(Request $request)
{
// คิว
$queue = 'examples';
// ข้อมูล (เมื่อส่งอาร์เรย์ ต้องทำการ serialize เอง เช่นใช้ json_encode, serialize เป็นต้น)
$data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
// ส่งข้อความ
Client::send($queue, $data);
return response('redis queue test');
}
}
เพื่อความเข้ากันได้กับโปรเจกต์อื่น Stomp component ไม่ได้ให้การ serialize และ deserialize อัตโนมัติ หากส่งข้อมูลเป็นอาร์เรย์ ต้อง serialize เอง และ deserialize เองเมื่อบริโภค
การบริโภคข้อความ
สร้างไฟล์ app/queue/stomp/MyMailSend.php (ชื่อคลาสใดก็ได้ ตามมาตรฐาน PSR-4)
<?php
namespace app\queue\stomp;
use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;
class MyMailSend implements Consumer
{
// ชื่อคิว
public $queue = 'examples';
// ชื่อการเชื่อมต่อ ตรงกับการเชื่อมต่อใน stomp.php
public $connection = 'default';
// เมื่อค่าเป็น client ต้องเรียก $ack_resolver->ack() เพื่อแจ้งเซิร์ฟเวอร์ว่าบริโภคสำเร็จ
// เมื่อค่าเป็น auto ไม่ต้องเรียก $ack_resolver->ack()
public $ack = 'auto';
// บริโภค
public function consume($data, AckResolver $ack_resolver = null)
{
// ถ้าข้อมูลเป็นอาร์เรย์ ต้อง deserialize เอง
var_export(json_decode($data, true)); // แสดง ['to' => 'tom@gmail.com', 'content' => 'hello']
// แจ้งเซิร์ฟเวอร์ว่าบริโภคสำเร็จ
$ack_resolver->ack(); // เมื่อ ack เป็น auto สามารถละเว้นการเรียกนี้ได้
}
}
เปิดใช้งานโปรโตคอล Stomp ใน RabbitMQ
RabbitMQ ไม่ได้เปิดใช้งานโปรโตคอล Stomp ตามค่าเริ่มต้น ต้องรันคำสั่งต่อไปนี้เพื่อเปิดใช้งาน
rabbitmq-plugins enable rabbitmq_stomp
หลังเปิดใช้งาน พอร์ต Stomp ค่าเริ่มต้นคือ 61613