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)時に渡されるイベントデータです。

注意:

同じイベントに2つのコールバック関数が登録されている場合、後者のコールバック関数が前者のコールバック関数を上書きします。

マルチプロセス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');