on

(요구 Workerman 버전 >= 3.3.0)

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

$event_name 사건을 구독하고 사건 발생 시의 콜백$callback_function을 등록합니다.

콜백 함수의 파라미터

$event_name

구독하는 사건의 이름으로, 임의의 문자열이 될 수 있습니다.

$callback_function

사건 발생 시 호출되는 콜백 함수입니다. 함수의 프로토타입은callback_function(mixed $event_data)입니다. $event_data는 사건 게시(publish) 시 전달되는 사건 데이터입니다.

주의:

같은 사건에 대해 두 개의 콜백 함수가 등록된 경우, 후자의 콜백 함수가 이전의 콜백 함수를 덮어씁니다.

예제

다중 프로세스 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 프로세스가 시작될 때
$worker->onWorkerStart = function($worker)
{
    // Channel 클라이언트가 Channel 서버에 연결
    Channel\Client::connect('127.0.0.1', 2206);
    // broadcast 사건을 구독하고 사건 콜백을 등록
    Channel\Client::on('broadcast', function($event_data)use($worker){
        // 현재 worker 프로세스의 모든 클라이언트에게 메시지 방송
        foreach($worker->connections as $connection)
        {
            $connection->send($event_data);
        }
    });
};

$worker->onMessage = function(TcpConnection $connection, $data)
{
   // 클라이언트로부터 받은 데이터를 사건 데이터로 간주
   $event_data = $data;
   // 모든 worker 프로세스에 broadcast 사건 발행
   \Channel\Client::publish('broadcast', $event_data);
};

Worker::runAll();

테스트

Chrome 브라우저를 열고 F12를 눌러 개발자 콘솔을 연 후, Console 항목에 입력하거나 아래 코드를 HTML 페이지에 넣어 JS로 실행합니다.

메시지를 받는 연결

// 127.0.0.1을 실제 Workerman이 있는 IP로 변경
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
    alert("서버로부터 받은 메시지: " + e.data);
};

메시지 방송

ws.send('hello world');