Exemple 1
(Workerman version requise >=3.3.0)
Système de diffusion multi-processus basé sur les Workers
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;
// Tableau de mappage global des groupes de connexions
$group_con_map = array();
$worker->onWorkerStart = function(){
// Le client de canal se connecte au serveur de canal
Channel\Client::connect('127.0.0.1', 2206);
// Ecouter l'événement d'envoi de messages de groupe global
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){
// Joindre un message de groupe {"cmd":"add_group", "group_id":"123"}
// ou envoyer un message de groupe {"cmd":"send_to_group", "group_id":"123", "message":"C'est le message"}
$data = json_decode($data, true);
var_dump($data);
$cmd = $data['cmd'];
$group_id = $data['group_id'];
switch($cmd) {
// Joindre un groupe de connexion
case "add_group":
global $group_con_map;
// Ajouter la connexion au tableau de groupe correspondant
$group_con_map[$group_id][$con->id] = $con;
// Enregistrer à quel groupe cette connexion a rejoint, pour faciliter le nettoyage des données du group_con_map correspondant au groupe lors de la fermeture
$con->group_id = isset($con->group_id) ? $con->group_id : array();
$con->group_id[$group_id] = $group_id;
break;
// Envoyer un message à un groupe
case "send_to_group":
// Channel\Client diffuser un événement d'envoi de groupe à tous les processus de tous les serveurs
Channel\Client::publish('send_to_group', array(
'group_id'=>$group_id,
'message'=>$data['message']
));
break;
}
};
// Il est très important de supprimer la connexion des données globales de groupe lorsqu'elle est fermée, pour éviter les fuites de mémoire
$worker->onClose = function(TcpConnection $con){
global $group_con_map;
// Parcourir tous les groupes auxquels la connexion a été ajoutée et supprimer les données correspondantes de 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 (supposons que tout fonctionne sur le même ordinateur 127.0.0.1)
-
Exécution du serveur
php start.php start Workerman[del.php] start in DEBUG mode ----------------------- WORKERMAN ----------------------------- Workerman version:3.4.2 PHP version:7.1.3 ------------------------ WORKERS ------------------------------- user worker listen processes status liliang ChannelServer frame://0.0.0.0:2206 1 [OK] liliang none websocket://0.0.0.0:1234 12 [OK] ---------------------------------------------------------------- Appuyez sur Ctrl-C pour quitter. Démarrage réussi.
-
Connexion du client au serveur
Ouvrez le navigateur Chrome, appuyez sur F12 pour ouvrir la console de débogage, puis saisissez ce qui suit dans la console (ou insérez le code suivant dans une page HTML et exécutez-le avec JavaScript)
// Supposons que l'adresse IP du serveur soit 127.0.0.1, veuillez la remplacer par l'adresse IP réelle du serveur pour les tests
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":"C'est le message"}');
};