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');