Exemple 1
(Exiger Workerman version >=3.3.0)
Système de push de groupe multi-processus basé sur 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;
// Tableau de mappage global des groupes aux connexions
$group_con_map = array();
$worker->onWorkerStart = function(){
// Le client Channel se connecte au serveur Channel
Channel\Client::connect('127.0.0.1', 2206);
// Écouter l'événement d'envoi de messages au 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){
// Message pour rejoindre un groupe {"cmd":"add_group", "group_id":"123"}
// Ou message de diffusion {"cmd":"send_to_group", "group_id":"123", "message":"这是消息"}
$data = json_decode($data, true);
var_dump($data);
$cmd = $data['cmd'];
$group_id = $data['group_id'];
switch($cmd) {
// Connexion au groupe
case "add_group":
global $group_con_map;
// Ajouter la connexion au tableau correspondant au groupe
$group_con_map[$group_id][$con->id] = $con;
// Enregistrer les groupes auxquels cette connexion a adhéré, pour faciliter le nettoyage des données group_con_map lors de onclose
$con->group_id = isset($con->group_id) ? $con->group_id : array();
$con->group_id[$group_id] = $group_id;
break;
// Diffuser un message au groupe
case "send_to_group":
// Channel\Client diffuse l'événement d'envoi de message au groupe à tous les processus de tous les serveurs
Channel\Client::publish('send_to_group', array(
'group_id'=>$group_id,
'message'=>$data['message']
));
break;
}
};
// C'est très important, quand la connexion est fermée, supprimer la connexion des données globales du groupe, pour éviter les fuites de mémoire
$worker->onClose = function(TcpConnection $con){
global $group_con_map;
// Parcourir tous les groupes auxquels la connexion a adhéré 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 s'exécute sur la machine locale 127.0.0.1)
- Lancer le serveur
php start.php start Workerman[del.php] démarré en mode DEBUG ----------------------- WORKERMAN ----------------------------- Version de Workerman :3.4.2 Version de PHP :7.1.3 ------------------------ WORKERS ------------------------------- utilisateur worker écouter processus statut liliang ChannelServer frame://0.0.0.0:2206 1 [OK] liliang aucun websocket://0.0.0.0:1234 12 [OK] ---------------------------------------------------------------- Appuyez sur Ctrl-C pour quitter. Démarrage réussi.
2. Connexion du client au serveur
Ouvrir le navigateur Chrome, appuyer sur F12 pour ouvrir la console de débogage, puis saisir dans l'onglet Console (ou mettre le code ci-dessous dans une page html et l'exécuter avec js)
```javascript
// Supposons que l'IP du serveur est 127.0.0.1, veuillez remplacer par l'IP du serveur réel lors des 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":"这是消息"}');
};