Come trasmettere (inviare a più destinatari) dati
Esempio (trasmissione programmata)
use Workerman\Worker;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// In questo esempio, il numero di processi deve essere 1
$worker->count = 1;
// Imposta un timer al momento dell'avvio del processo, per inviare dati a tutti i client connessi
$worker->onWorkerStart = function($worker)
{
// Ogni 10 secondi
Timer::add(10, function()use($worker)
{
// Itera su tutte le connessioni dei client del processo corrente, inviando l'ora attuale del server
foreach($worker->connections as $connection)
{
$connection->send(time());
}
});
};
// Esegui il worker
Worker::runAll();
Esempio (chat di gruppo)
use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:2020');
// In questo esempio, il numero di processi deve essere 1
$worker->count = 1;
// Quando un client invia un messaggio, trasmettilo agli altri utenti
$worker->onMessage = function(TcpConnection $connection, $message)use($worker)
{
foreach($worker->connections as $connection)
{
$connection->send($message);
}
};
// Esegui il worker
Worker::runAll();
Spiegazione:
Singolo processo:
Gli esempi sopra possono funzionare solo in singolo processo ($worker->count=1), poiché in caso di più processi, diversi client potrebbero connettersi a processi differenti, rendendo i client tra i vari processi isolati e impossibilitati a comunicare direttamente. In altre parole, un processo A non può direttamente operare sull'oggetto connection del client nel processo B per inviare dati. (Per riuscirci, è necessario utilizzare la comunicazione inter-processo, ad esempio utilizzando il componente Channel, come esempio - invio in cluster, esempio - invio di gruppo).
Consiglio di usare GatewayWorker
Il framework GatewayWorker, sviluppato su Workerman, offre un meccanismo di push più conveniente, che include multicast e broadcast, e permette di impostare più processi o addirittura più server. Se è necessario inviare dati ai client, si consiglia di utilizzare il framework GatewayWorker.
Indirizzo del manuale di GatewayWorker: https://doc2.workerman.net