Esempio 1

(Richiesta Workerman versione >= 3.3.0)

Un sistema di push distribuito basato su processi multipli (cluster), invio di massa e broadcasting nel cluster.

start_channel.php
Il sistema può avere solo un servizio start_channel. Supponiamo che venga eseguito su 192.168.1.1.

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

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

Worker::runAll();

start_ws.php
Il sistema può avere più servizi start_ws, supponiamo che vengano eseguiti su 192.168.1.2 e 192.168.1.3.

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

// Server websocket
$worker = new Worker('websocket://0.0.0.0:4236');
$worker->count=2;
$worker->name = 'pusher';
$worker->onWorkerStart = function($worker)
{
    // Il client Channel si connette al server Channel
    Channel\Client::connect('192.168.1.1', 2206);
    // Usa l'ID del proprio processo come nome dell'evento
    $event_name = $worker->id;
    // Sottoscrivi all'evento worker->id e registra la funzione di gestione dell'evento
    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 "connessione non esiste\n";
            return;
        }
        $to_connection = $worker->connections[$to_connection_id];
        $to_connection->send($message);
    });

    // Sottoscrivi all'evento broadcast
    $event_name = 'broadcast';
    // Dopo aver ricevuto l'evento broadcast, invia i dati di broadcast a tutte le connessioni client nel processo attuale
    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} connesso\n";
    echo $msg;
    $connection->send($msg);
};
Worker::runAll();

start_http.php
Il sistema può avere più servizi start_http, supponiamo che vengano eseguiti su 192.168.1.4 e 192.168.1.5.

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

// Usato per gestire le richieste http, per inviare dati a qualsiasi client, è necessario inviare workerID e 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)
{
    // Compatibile con workerman4.x 5.x
    if (!is_array($request)) {
        $get = $request->get();
    }
    $connection->send('ok');
    if(empty($get['content'])) return;
    // Invia dati a una certa connessione in un certo processo 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
        ));
    }
    // È un'invio dati globale
    else
    {
        $event_name = 'broadcast';
        $content = $get['content'];
        Channel\Client::publish($event_name, array(
           'content'          => $content
        ));
    }
};

Worker::runAll();

Test

  1. Esegui i servizi su ogni server.

  2. I client si connettono al server.

Apri il browser Chrome, premi F12 per aprire la console di debug, inserisci nella scheda Console (o inserisci il codice seguente in una pagina html per eseguirlo con js)

// Può anche connettersi a ws://192.168.1.3:4236
ws = new WebSocket("ws://192.168.1.2:4236");
ws.onmessage = function(e) {
    alert("Messaggio ricevuto dal server: " + e.data);
};
  1. Invia dati tramite l'interfaccia http.

Accedi all'url http://192.168.1.4:4237/?content={$content} oppure http://192.168.1.5:4237/?content={$content} per inviare dati $content a tutte le connessioni client.

Accedi all'url http://192.168.1.4:4237/?to_worker_id={$worker_id}&to_connection_id={$connection_id}&content={$content} oppure http://192.168.1.5:4237/?to_worker_id={$worker_id}&to_connection_id={$connection_id}&content={$content} per inviare dati $content a una certa connessione client in un certo processo worker.

Nota: Durante il test, sostituisci {$worker_id}, {$connection_id} e {$content} con i valori effettivi.