Exemple 1

(requiert Workerman version >=3.3.0)

Système de diffusion basé sur Worker (cluster distribué), envoi groupé et diffusion de groupe.

start_channel.php
Le système ne peut déployer qu'un seul service start_channel. Supposons qu'il fonctionne sur 192.168.1.1.

<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

// Initialiser un serveur Channel
$channel_server = new Channel\Server('0.0.0.0', 2206);

Worker::runAll();

start_ws.php
Le système peut déployer plusieurs services start_ws, supposons qu'il fonctionne sur les serveurs 192.168.1.2 et 192.168.1.3.

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

// Serveur websocket
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->count=2;
$worker->name = 'pusher';
$worker->onWorkerStart = function($worker)
{
    // Le client Channel se connecte au serveur Channel
    Channel\Client::connect('192.168.1.1', 2206);
    // Utiliser l'identifiant de son propre processus comme nom d'événement
    $event_name = $worker->id;
    // S'abonner à l'événement worker->id et enregistrer la fonction de traitement d'événement
    Channel\Client::on($event_name, function($event_data)use($worker){
        $to_connection_id = $event_data['to_connection_id'];
        $message = $event_data['content'];
        if(!isset($worker->connections[$to_connection_id]))
        {
            echo "la connexion n'existe pas\n";
            return;
        }
        $to_connection = $worker->connections[$to_connection_id];
        $to_connection->send($message);
    });

    // S'abonner à l'événement de diffusion
    $event_name = '广播';
    // Après avoir reçu un événement de diffusion, envoyer les données de diffusion à toutes les connexions clients dans le processus actuel
    Channel\Client::on($event_name, function($event_data)use($worker){
        $message = $event_data['content'];
        foreach($worker->connections as $connection)
        {
            $connection->send($message);
        }
    });
};

$worker->onConnect = function(TcpConnection $connection)use($worker)
{
    $msg = "workerID:{$worker->id} connectionID:{$connection->id} connecté\n";
    echo $msg;
    $connection->send($msg);
};
Worker::runAll();

start_http.php
Le système peut également déployer plusieurs services start_http, supposons qu'il fonctionne sur les serveurs 192.168.1.4 et 192.168.1.5.

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

// Utilisé pour traiter les requêtes http et envoyer des données à n'importe quel client, nécessite de passer workerID et connectionID
$http_worker = new Worker('http://0.0.0.0:4237');
$http_worker->name = 'publisher';
$http_worker->onWorkerStart = function()
{
    Channel\Client::connect('192.168.1.1', 2206);
};
$http_worker->onMessage = function(TcpConnection $connection, $request)
{
    // Compatibilité avec workerman4.x 5.x
    if (!is_array($request)) {
        $get = $request->get();
    }
    $connection->send('ok');
    if(empty($get['content'])) return;
    // Envoi de données à une connexion spécifique dans un processus worker
    if(isset($get['to_worker_id']) && isset($get['to_connection_id']))
    {
        $event_name = $get['to_worker_id'];
        $to_connection_id = $get['to_connection_id'];
        $content = $get['content'];
        Channel\Client::publish($event_name, array(
           'to_connection_id' => $to_connection_id,
           'content'          => $content
        ));
    }
    // Envoi de données de diffusion globale
    else
    {
        $event_name = '广播';
        $content = $get['content'];
        Channel\Client::publish($event_name, array(
           'content'          => $content
        ));
    }
};

Worker::runAll();

Test

  1. Lancer les services sur chaque serveur

  2. Le client se connecte au serveur

Ouvrez le navigateur Chrome, appuyez sur F12 pour ouvrir la console de débogage, puis entrez (ou placez le code ci-dessous dans une page html pour l'exécuter avec js)

// Peut également se connecter à ws://192.168.1.3:4236
ws = new WebSocket("ws://192.168.1.2:4236");
ws.onmessage = function(e) {
    alert("Message reçu du serveur : " + e.data);
};
  1. Envoyer un message via l'API http

Accéder à l'url http://192.168.1.4:4237/?content={$content} ou http://192.168.1.5:4237/?content={$content} pour envoyer les données $content à toutes les connexions clientes

Accéder à l'url http://192.168.1.4:4237/?to_worker_id={$worker_id}&to_connection_id={$connection_id}&content={$content} ou http://192.168.1.5:4237/?to_worker_id={$worker_id}&to_connection_id={$connection_id}&content={$content} pour envoyer les données $content à une connexion cliente spécifique dans un processus worker

Remarque : lors des tests, remplacez {$worker_id}, {$connection_id} et {$content} par des valeurs réelles