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)
- 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"}');
};