on
(requerido Workerman versión >=3.3.0)
void \Channel\Client::on(string $event_name, callback $callback_function)
Suscribirse al evento $event_name y registrar una función de callback $callback_function que se ejecutará cuando ocurra el evento.
Parámetros de la función de callback
$event_name
Nombre del evento al que se suscribe, puede ser cualquier cadena de caracteres.
$callback_function
Función de callback que se activa cuando ocurre el evento. El prototipo de la función es callback_function(mixed $event_data). $event_data es la información del evento que se pasa al publicar (publish) el evento.
Nota:
Si se registran dos funciones de callback para el mismo evento, la última función de callback sobrescribirá la anterior.
Ejemplo
Worker multiproceso (múltiples servidores), un cliente envía un mensaje, el mensaje se transmite a todos los clientes
start.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Inicializar un servidor Channel
$channel_server = new Channel\Server('0.0.0.0', 2206);
// servidor websocket
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->name = 'websocket';
$worker->count = 6;
// Cada proceso worker al iniciar
$worker->onWorkerStart = function($worker)
{
// Cliente de Channel se conecta al servidor Channel
Channel\Client::connect('127.0.0.1', 2206);
// Suscribirse al evento broadcast y registrar la callback
Channel\Client::on('broadcast', function($event_data) use($worker){
// Enviar mensaje a todos los clientes en el proceso worker actual
foreach($worker->connections as $connection)
{
$connection->send($event_data);
}
});
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Tratar los datos enviados por el cliente como datos del evento
$event_data = $data;
// Publicar el evento broadcast a todos los procesos worker
\Channel\Client::publish('broadcast', $event_data);
};
Worker::runAll();
Prueba
Abre el navegador Chrome, presiona F12 para abrir la consola de depuración, e ingresa en la sección Console (o coloca el código a continuación en la página html para ejecutarlo con js)
Conexión para recibir mensajes
// Cambia 127.0.0.1 por la IP donde se encuentra Workerman
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
alert("Mensaje recibido del servidor: " + e.data);
};
Enviar mensaje de difusión
ws.send('hello world');