on
(richiede Workerman versione >= 3.3.0)
void \Channel\Client::on(string $event_name, callback $callback_function)
Iscrive all'evento $event_name e registra la funzione di callback $callback_function da eseguire quando l'evento si verifica.
Parametri della funzione di callback
$event_name
Nome dell'evento a cui ci si iscrive, può essere una qualsiasi stringa.
$callback_function
Funzione di callback attivata quando si verifica l'evento. La firma della funzione è callback_function(mixed $event_data). $event_data sono i dati dell'evento trasmessi durante la pubblicazione (publish) dell'evento.
Attenzione:
Se lo stesso evento ha due funzioni di callback registrate, la funzione di callback successiva sovrascriverà la precedente.
Esempio
Worker multiprocesso (più server), un client invia un messaggio, broadcast a tutti i client
start.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Inizializza un server Channel
$channel_server = new Channel\Server('0.0.0.0', 2206);
// server websocket
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->name = 'websocket';
$worker->count = 6;
// All'avvio di ogni processo worker
$worker->onWorkerStart = function($worker)
{
// Il client Channel si connette al server Channel
Channel\Client::connect('127.0.0.1', 2206);
// Iscrive all'evento broadcast e registra la callback dell'evento
Channel\Client::on('broadcast', function($event_data)use($worker){
// Broadcast del messaggio a tutti i client del processo worker corrente
foreach($worker->connections as $connection)
{
$connection->send($event_data);
}
});
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Tratta i dati inviati dal client come dati dell'evento
$event_data = $data;
// Pubblica l'evento broadcast a tutti i processi worker
\Channel\Client::publish('broadcast', $event_data);
};
Worker::runAll();
Test
Apri il browser Chrome, premi F12 per aprire la console di debug, nella sezione Console inserisci (o metti il codice qui sotto in una pagina html per eseguirlo in js)
Connessione per ricevere messaggi
// Sostituisci 127.0.0.1 con l'ip effettivo dove si trova workerman
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
alert("Messaggio ricevuto dal server: " + e.data);
};
Messaggio broadcast
ws.send('hello world');