วิธีการกระจาย (ส่งข้อมูลแบบกลุ่ม)
ตัวอย่าง (การกระจายข้อมูลตามเวลา)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// ในตัวอย่างนี้จำนวนโปรเซสต้องเป็น 1
$worker->count = 1;
// ตั้งค่าไทม์เมอร์เมื่อโปรเซสเริ่มต้น เพื่อส่งข้อมูลไปยังการเชื่อมต่อของคลาสทั้งหมด
$worker->onWorkerStart = function($worker)
{
// ตั้งเวลา ทุก ๆ 10 วินาที
Timer::add(10, function()use($worker)
{
// ลูปผ่านการเชื่อมต่อทั้งหมดของโปรเซสปัจจุบัน ส่งเวลาปัจจุบันของเซิร์ฟเวอร์
foreach($worker->connections as $connection)
{
$connection->send(time());
}
});
};
// รัน worker
Worker::runAll();
ตัวอย่าง (การสนทนาแบบกลุ่ม)
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// ในตัวอย่างนี้จำนวนโปรเซสต้องเป็น 1
$worker->count = 1;
// เมื่อคลาสส่งข้อความมา ให้กระจายให้ผู้ใช้งานคนอื่น
$worker->onMessage = function(TcpConnection $connection, $message)use($worker)
{
foreach($worker->connections as $connection)
{
$connection->send($message);
}
};
// รัน worker
Worker::runAll();
คำอธิบาย:
โปรเซสเดียว:
ตัวอย่างข้างต้นสามารถทำงานได้เพียง โปรเซสเดียว ($worker->count=1), เพราะในกรณีที่มีหลายโปรเซส ลูกค้าหลายคนอาจจะเชื่อมต่อกับโปรเซสที่แตกต่างกัน ซึ่งลูกค้าภายในโปรเซสจะถูกแยกออกจากกัน ไม่สามารถติดต่อโดยตรงได้ นั่นคือโปรเซส A ไม่สามารถ ติดต่อ กับวัตถุ connection ของโปรเซส B เพื่อส่งข้อมูลได้ (หากต้องการทำเช่นนี้ ต้องใช้การติดต่อระหว่างโปรเซส เช่น การใช้ Channel component เช่น ตัวอย่าง-การส่งข้อมูลแบบกลุ่ม, ตัวอย่าง-การส่งข้อมูลแบบกลุ่ม)。
แนะนำให้ใช้ GatewayWorker
Framework GatewayWorker ที่พัฒนาขึ้นบนพื้นฐานของ workerman มีระบบส่งข้อมูลที่สะดวกกว่า รวมถึงการส่งข้อมูลแบบกลุ่ม การกระจายข้อมูล และอื่น ๆ สามารถตั้งค่าให้มีหลายโปรเซสหรือแม้แต่การปรับใช้หลายเซิร์ฟเวอร์ หากต้องการส่งข้อมูลไปยังคลาสแนะนำให้ใช้ Framework GatewayWorker。
ที่อยู่เอกสาร GatewayWorker https://doc2.workerman.net