Exemple 1

(Exiger Workerman version >=3.3.0)

Système de push de groupe multi-processus basé sur Worker

    use Workerman\Worker;
    use Workerman\Connection\TcpConnection;
    require_once __DIR__ . '/vendor/autoload.php';

    $channel_server = new Channel\Server('0.0.0.0', 2206);

    $worker = new Worker('websocket://0.0.0.0:1234');
    $worker->count = 8;
    // Tableau de mappage global des groupes aux connexions
    $group_con_map = array();
    $worker->onWorkerStart = function(){
        // Le client Channel se connecte au serveur Channel
        Channel\Client::connect('127.0.0.1', 2206);

        // Écouter l'événement d'envoi de messages au groupe global
        Channel\Client::on('send_to_group', function($event_data){
            $group_id = $event_data['group_id'];
            $message = $event_data['message'];
            global $group_con_map;
            var_dump(array_keys($group_con_map));
            if (isset($group_con_map[$group_id])) {
                foreach ($group_con_map[$group_id] as $con) {
                    $con->send($message);
                }
            }
        });
    };
    $worker->onMessage = function(TcpConnection $con, $data){
        // Message pour rejoindre un groupe {"cmd":"add_group", "group_id":"123"}
        // Ou message de diffusion {"cmd":"send_to_group", "group_id":"123", "message":"这是消息"}
        $data = json_decode($data, true);
        var_dump($data);
        $cmd = $data['cmd'];
        $group_id = $data['group_id'];
        switch($cmd) {
            // Connexion au groupe
            case "add_group":
                global $group_con_map;
                // Ajouter la connexion au tableau correspondant au groupe
                $group_con_map[$group_id][$con->id] = $con;
                // Enregistrer les groupes auxquels cette connexion a adhéré, pour faciliter le nettoyage des données group_con_map lors de onclose
                $con->group_id = isset($con->group_id) ? $con->group_id : array();
                $con->group_id[$group_id] = $group_id;
                break;
            // Diffuser un message au groupe
            case "send_to_group":
                // Channel\Client diffuse l'événement d'envoi de message au groupe à tous les processus de tous les serveurs
                Channel\Client::publish('send_to_group', array(
                    'group_id'=>$group_id,
                    'message'=>$data['message']
                ));
                break;
        }
    };
    // C'est très important, quand la connexion est fermée, supprimer la connexion des données globales du groupe, pour éviter les fuites de mémoire
    $worker->onClose = function(TcpConnection $con){
        global $group_con_map;
        // Parcourir tous les groupes auxquels la connexion a adhéré et supprimer les données correspondantes de group_con_map
        if (isset($con->group_id)) {
            foreach ($con->group_id as $group_id) {
                unset($group_con_map[$group_id][$con->id]);
                if (empty($group_con_map[$group_id])) {
                    unset($group_con_map[$group_id]);
                }
            }
        }
    };

    Worker::runAll();

Test (Supposons que tout s'exécute sur la machine locale 127.0.0.1)

  1. Lancer le serveur
    
    php start.php start
    Workerman[del.php] démarré en mode DEBUG
    ----------------------- WORKERMAN -----------------------------
    Version de Workerman :3.4.2          Version de PHP :7.1.3
    ------------------------ WORKERS -------------------------------
    utilisateur    worker         écouter                    processus statut
    liliang        ChannelServer  frame://0.0.0.0:2206       1         [OK] 
    liliang        aucun          websocket://0.0.0.0:1234   12        [OK] 
    ----------------------------------------------------------------
    Appuyez sur Ctrl-C pour quitter. Démarrage réussi.

2. Connexion du client au serveur

Ouvrir le navigateur Chrome, appuyer sur F12 pour ouvrir la console de débogage, puis saisir dans l'onglet Console (ou mettre le code ci-dessous dans une page html et l'exécuter avec js)

```javascript
// Supposons que l'IP du serveur est 127.0.0.1, veuillez remplacer par l'IP du serveur réel lors des tests
ws = new WebSocket('ws://127.0.0.1:1234');
ws.onmessage = function(data){console.log(data.data)};
ws.onopen = function() {
    ws.send('{"cmd":"add_group", "group_id":"123"}');
    ws.send('{"cmd":"send_to_group", "group_id":"123", "message":"这是消息"}');
};