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 — это данные события, переданные при публикации события.

注意:

Если для одного и того же события зарегистрировано два колбэк-функции, то последняя колбэк-функция заменит предыдущую.

Пример

Многопроцессный 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);

// Вебсокет сервер
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->name = 'websocket';
$worker->count = 6;
// При запуске каждого рабочего процесса
$worker->onWorkerStart = function($worker)
{
    // Клиент Channel подключается к серверу Channel
    Channel\Client::connect('127.0.0.1', 2206);
    // Подписка на событие broadcast и регистрация колбэк-функции
    Channel\Client::on('broadcast', function($event_data)use($worker){
        // Трансляция сообщения всем клиентам текущего рабочего процесса
        foreach($worker->connections as $connection)
        {
            $connection->send($event_data);
        }
    });
};

$worker->onMessage = function(TcpConnection $connection, $data)
{
   // Данные, полученные от клиента, считаются данными события
   $event_data = $data;
   // Публикация события broadcast для всех рабочих процессов
   \Channel\Client::publish('broadcast', $event_data);
};

Worker::runAll();

Тестирование

Откройте браузер Chrome, нажмите F12, чтобы открыть инструмент разработчика, и введите в разделе Console (или вставьте следующий код на html-страницу для выполнения через js):

Получение сообщений по подключению

// Замените 127.0.0.1 на фактический IP адрес workerman
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
    alert("Получено сообщение от сервера: " + e.data);
};

Трансляция сообщения

ws.send('hello world');