Socket.io avec apache – ID du client socket 1 actualisé lors de la connexion du client 2

J’utilise socket.io dans mon application cakephp3 pour afficher l’état de leurs requêtes traitées aux clients connectés.

Script de socket (Server.js) :

var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var jsdom = require("jsdom"); const { JSDOM } = jsdom; var dom = new JSDOM(""); var $ = require("jquery")(dom.window); io.on('connection', function(socket){ console.log('A user connected'); socket.on('Event 1', function(data, fn){ // Data received successfully!!! fn(); // Processing sock.emit('Return 1', {data}); }); socket.on('disconnect', function(){ console.log('A user disconnected'); }); socket.on('Event 2', function(data){ // Processing var uid = data['uid']; //adding same user socket if(!sockets_uid[uid]){ sockets_uid[uid] = []; } sockets_uid[uid].push(socket); $.each(sockets_uid, function(i, sock){ sock.emit('Return 2', res); }); }); http.listen(2105, function(){ console.log('Started on 2105'); }); 

Client javascript (client.js) placé dans default.ctp (disposition de rendu par défaut de CakePHP) :

 var nodeToken = "request->session()->read('nodeToken');?>"; var socket = io('http://localhost/node', {secure: true, query: {token: nodeToken}}); socket.on('connect_error', function(){ console.log('Unable to connect); }); 

Le stream de travail fonctionne comme prévu lorsque le client se connecte au serveur de noeud via http://localhost:2105 .

Mais lors du portage du code en production, j’ai utilisé apache (v2.4.7) pour masquer le port en utilisant Proxy Pass et rewrite pour transférer les requêtes vers http://localhost/node . Apache2 config :

Lors de la connexion au noeud via apache, la connexion initiale est établie avec succès et le client reçoit les réponses du serveur de noeud comme prévu. Comme la connexion client-socket est écrite dans default.ctp, la connexion au serveur de noeud est actualisée sur chaque actualisation de la page ou redirigée vers toute autre vue à l’aide de la même disposition default.ctp.

Le problème auquel je suis confronté est que dès qu’une action est effectuée, par exemple en appelant une autre ctp de vue, le client parent n’a pas pu recevoir de mise à jour envoyée par le serveur de nœud au client.

Si apache n’est pas utilisé et que le serveur de noeuds est directement connecté au port dans client.js, alors tout fonctionne comme prévu, donc je pense qu’il doit y avoir un problème dans la configuration du proxy pass apache2. J’ai déjà activé les modules mod_proxy et mod_ws_proxy .

Toute aide serait très appréciée.

Après beaucoup de recherches sur Google et de navigation, j’ai constaté qu’après le rechargement de la page ou dans mon cas, la mise en page default.ctp est utilisée pour un autre rendu de vue, la connexion de socket est terminée de manière disgracieuse .

Donc, j’ai résolu ce problème en maintenant 3 tableaux pour la tenue:

  • Utilisateurs => Sockets-IDS
  • Sockets-IDs => Sockets, et
  • Toutes les sockets actives

Maintenant, lors de la déconnexion de la mise à jour / de la mise à jour de la page, j’ai supprimé les anciens sockets terminés et n’émets l’événement que sur les nouveaux sockets.

 socket.on('disconnect', function(){ var socket_id = socket.id; var uid = uids_sockets[socket_id]; delete sockets[socket_id]; var temp_array = sockets_uid[uid]; var index = temp_array.indexOf(socket_id); temp_array.splice(index, 1); sockets_uid[uid] = temp_array; }); 

De plus, du côté du client, j’émets l’événement de démarrage sur l’événement de connexion de socket, donc après qu’une nouvelle connexion est établie, l’événement est ré-enregistré avec le nouveau socket.

Toute la configuration n’est pas requirejse si la connexion au nœud est établie directement sans utiliser le middleware Apache Proxy-pass .