Esempio 1

(richiede Workerman versione >= 3.3.0)

Sistema di push multi-processo basato su 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;
    // Mappa globale delle connessioni ai gruppi
    $group_con_map = array();
    $worker->onWorkerStart = function(){
        // Il client Channel si connette al server Channel
        Channel\Client::connect('127.0.0.1', 2206);

        // Ascolta l'evento dell'invio di messaggi al gruppo globale
        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){
        // Messaggio per unirsi al gruppo {"cmd":"add_group", "group_id":"123"}
        // oppure messaggio da inviare a tutti {"cmd":"send_to_group", "group_id":"123", "message":"questo è un messaggio"}
        $data = json_decode($data, true);
        var_dump($data);
        $cmd = $data['cmd'];
        $group_id = $data['group_id'];
        switch($cmd) {
            // Connessione per unirsi a un gruppo
            case "add_group":
                global $group_con_map;
                // Aggiungi la connessione all'array del gruppo corrispondente
                $group_con_map[$group_id][$con->id] = $con;
                // Registra i gruppi a cui si è unita questa connessione, utile per pulire i dati del gruppo_con_map quando si chiude la connessione
                $con->group_id = isset($con->group_id) ? $con->group_id : array();
                $con->group_id[$group_id] = $group_id;
                break;
            // Invia messaggio a un gruppo
            case "send_to_group":
                // Channel\Client pubblica un evento di invio messaggio al gruppo a tutti i processi di tutti i server
                Channel\Client::publish('send_to_group', array(
                    'group_id'=>$group_id,
                    'message'=>$data['message']
                ));
                break;
        }
    };
    // Questo è molto importante, quando la connessione si chiude, rimuovi la connessione dai dati globali del gruppo per evitare perdite di memoria
    $worker->onClose = function(TcpConnection $con){
        global $group_con_map;
        // Scorri tutti i gruppi a cui la connessione è unita e rimuovi i dati corrispondenti da 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 (si assume che tutto sia in esecuzione sulla macchina locale 127.0.0.1)

  1. Eseguire il server
    
    php start.php start
    Workerman[del.php] avviato in modalità DEBUG
    ----------------------- WORKERMAN -----------------------------
    Versione Workerman: 3.4.2          Versione PHP: 7.1.3
    ------------------------ WORKERS -------------------------------
    utente        worker         ascolta                    processi stato
    liliang       ChannelServer  frame://0.0.0.0:2206       1         [OK] 
    liliang       nessuno        websocket://0.0.0.0:1234   12        [OK] 
    ----------------------------------------------------------------
    Premi Ctrl-C per uscire. Avvio riuscito.

2. Il client si connette al server

Apri il browser Chrome, premi F12 per aprire la console di debug, nella sezione Console inserisci (oppure inserisci il codice sottostante in una pagina HTML e eseguilo con js)

```javascript
// Presupponendo che l'IP del server sia 127.0.0.1, durante il test si prega di cambiare con l'IP del server reale
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":"questo è un messaggio"}');
};