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');