on
(requer Workerman versão >= 3.3.0)
void \Channel\Client::on(string $event_name, callback $callback_function)
Assina o evento $event_name e registra a função de retorno de chamada $callback_function que será executada quando o evento ocorrer.
Parâmetros da função de retorno de chamada
$event_name
Nome do evento assinado, que pode ser qualquer string.
$callback_function
Função de retorno de chamada que é acionada quando o evento ocorre. A assinatura da função é callback_function(mixed $event_data). $event_data é os dados do evento que foram passados durante a publicação (publish) do evento.
Atenção:
Se dois callbacks forem registrados para o mesmo evento, o segundo callback irá sobrescrever o primeiro callback.
Exemplo
Worker de múltiplos processos (múltiplos servidores), um cliente envia uma mensagem, que é transmitida para todos os clientes
start.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Inicializa um 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;
// Quando cada processo worker é iniciado
$worker->onWorkerStart = function($worker)
{
// Cliente Channel conecta-se ao servidor Channel
Channel\Client::connect('127.0.0.1', 2206);
// Assina o evento broadcast e registra o callback do evento
Channel\Client::on('broadcast', function($event_data)use($worker){
// Transmite mensagens para todos os clientes do processo do worker atual
foreach($worker->connections as $connection)
{
$connection->send($event_data);
}
});
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Trata os dados enviados pelo cliente como dados do evento
$event_data = $data;
// Publica o evento broadcast para todos os processos do worker
\Channel\Client::publish('broadcast', $event_data);
};
Worker::runAll();
Teste
Abra o navegador Chrome, pressione F12 para abrir o console de depuração, insira na coluna Console (ou coloque o código abaixo na página html para executar com js)
Conexão para receber mensagens
// Troque 127.0.0.1 pelo IP real onde o Workerman está
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
alert("Mensagem recebida do servidor: " + e.data);
};
Transmitir mensagem
ws.send('hello world');