on

(ต้องการเวอร์ชัน Workerman >= 3.3.0)

void \Channel\Client::on(string $event_name, callback $callback_function)

สมัครสมาชิกเหตุการณ์ $event_name และลงทะเบียนฟังก์ชัน callback $callback_function เมื่อเกิดเหตุการณ์

พารามิเตอร์ของฟังก์ชัน callback

$event_name

ชื่อของเหตุการณ์ที่สมัครสมาชิก ซึ่งสามารถเป็นสตริงใดก็ได้

$callback_function

ฟังก์ชัน callback ที่ถูกเรียกเมื่อเกิดเหตุการณ์ ฟังก์ชัน prototype คือ callback_function(mixed $event_data) โดยที่ $event_data คือข้อมูลเหตุการณ์ที่ส่งเมื่อมีการเผยแพร่ (publish) เหตุการณ์

注意:

如果同一个事件注册了两个回调函数,后一个回调函数将覆盖前一个回调函数。

范例

Multi-process Worker (หลายเซิร์ฟเวอร์),一个客户端发消息,广播给所有客户端

start.php

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// เริ่มต้น Channel เซิร์ฟเวอร์
$channel_server = new Channel\Server('0.0.0.0', 2206);

// เซิร์ฟเวอร์ websocket
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->name = 'websocket';
$worker->count = 6;
// เมื่อแต่ละ worker process เริ่มทำงาน
$worker->onWorkerStart = function($worker)
{
    // เชื่อมต่อ Channel client กับ Channel server
    Channel\Client::connect('127.0.0.1', 2206);
    // สมัครสมาชิกเหตุการณ์ broadcast และลงทะเบียน callback ของเหตุการณ์
    Channel\Client::on('broadcast', function($event_data)use($worker){
        // ส่งข้อความไปยัง client ทุกตัวใน worker process ปัจจุบัน
        foreach($worker->connections as $connection)
        {
            $connection->send($event_data);
        }
    });
};

$worker->onMessage = function(TcpConnection $connection, $data)
{
   // นำข้อมูลที่ client ส่งมาใช้เป็นข้อมูลเหตุการณ์
   $event_data = $data;
   // เผยแพร่เหตุการณ์ broadcast ไปยัง worker process ทุกตัว
   \Channel\Client::publish('broadcast', $event_data);
};

Worker::runAll();

การทดสอบ

เปิดเบราว์เซอร์ Chrome กด F12 เพื่อเปิดคอนโซลการดีบัก จากนั้นใส่ใน Console (หรือจะนำโค้ดด้านล่างนี้ไปใส่ในหน้า html และรันด้วย js)

เชื่อมต่อรับข้อความ

// เปลี่ยน 127.0.0.1 เป็นไอพีจริงที่ Workerman ตั้งอยู่
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
    alert("ได้รับข้อความจากเซิร์ฟเวอร์:" + e.data);
};

ส่งข้อความแบบกระจาย

ws.send('hello world');