on
(requiert Workerman version >= 3.3.0)
void \Channel\Client::on(string $event_name, callback $callback_function)
Abonnez-vous à l'événement $event_name et enregistrez la fonction de rappel $callback_function qui sera déclenchée lorsque l'événement se produit.
Paramètres de la fonction de rappel
$event_name
Nom de l'événement abonné, il peut s'agir de n'importe quelle chaîne.
$callback_function
Fonction de rappel déclenchée lorsque l'événement se produit. Le prototype de la fonction est callback_function(mixed $event_data). $event_data est les données de l'événement transmises lors de la publication (publish) de l'événement.
Attention :
Si deux fonctions de rappel sont enregistrées pour le même événement, la seconde fonction de rappel remplacera la première fonction de rappel.
Exemple
Worker multiprocessus (multi-serveur), un client envoie un message, diffusant à tous les clients
start.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Initialiser un serveur Channel
$channel_server = new Channel\Server('0.0.0.0', 2206);
// serveur websocket
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->name = 'websocket';
$worker->count = 6;
// À chaque démarrage d'un processus worker
$worker->onWorkerStart = function($worker)
{
// Le client Channel se connecte au serveur Channel
Channel\Client::connect('127.0.0.1', 2206);
// S'abonner à l'événement broadcast et enregistrer la fonction de rappel de l'événement
Channel\Client::on('broadcast', function($event_data)use($worker){
// Diffuser le message à tous les clients du processus worker actuel
foreach($worker->connections as $connection)
{
$connection->send($event_data);
}
});
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Traiter les données envoyées par le client comme des données d'événement
$event_data = $data;
// Publier l'événement broadcast à tous les processus worker
\Channel\Client::publish('broadcast', $event_data);
};
Worker::runAll();
Tester
Ouvrez le navigateur Chrome, appuyez sur F12 pour ouvrir la console de débogage, saisissez dans l'onglet Console (ou insérez le code ci-dessous dans une page html pour l'exécuter avec js)
Connexion pour recevoir des messages
// Remplacez 127.0.0.1 par l'ip réelle où Workerman se trouve
ws = new WebSocket("ws://127.0.0.1:4236");
ws.onmessage = function(e) {
alert("Message reçu du serveur : " + e.data);
};
Diffuser un message
ws.send('hello world');