使用php和socket.io的通知系统

使用php和socket.io的通知系统,php,javascript,socket.io,Php,Javascript,Socket.io,我正在尝试用php和socket.io构建一个通知系统。其思想是,客户端连接到socket.io并等待通知。PHP脚本通过另一个端口上的curl连接到socket.io,并将更新发送到连接的客户端。客户端通过连接事件后在消息中发送的id进行标识。我存储与用户id关联的套接字变量。一切正常,但一段时间后脚本停止工作。似乎过了一段时间后,存储在数组中的套接字变量。但是,我的服务器代码发布在下面 var notification_port = 8001; var oak_port =

我正在尝试用php和socket.io构建一个通知系统。其思想是,客户端连接到socket.io并等待通知。PHP脚本通过另一个端口上的curl连接到socket.io,并将更新发送到连接的客户端。客户端通过连接事件后在消息中发送的id进行标识。我存储与用户id关联的套接字变量。一切正常,但一段时间后脚本停止工作。似乎过了一段时间后,存储在数组中的套接字变量。但是,我的服务器代码发布在下面

var notification_port = 8001;
var oak_port          = 8002;

var io = require('socket.io').listen(notification_port);
var clients = new Array();

io.sockets.on("connection", function(socket){
   socket.on("__identification", function(message){
      if (message.id){
         console.log("user with session id " + message.id + " connected!");
         var sockets = clients[message.id];
         if (!sockets){
            sockets = new Array();
         }
         sockets.push(socket);
         clients[message.id] = sockets;
      }
   });
});

var url  = require('url');
var oakListener = require('http').createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});

  var url_parts = url.parse(req.url, true);
  var query = url_parts.query;

  var sockets = clients[query.id];
  if (sockets){
     for (var i = 0; i < sockets.length; i++){
        sockets[i].emit("notification", query);
      }
      res.end('ok');
  } else {
     res.end('failed');
  }
}).listen(oak_port);
var通知\u端口=8001;
var oak_端口=8002;
var io=require('socket.io')。侦听(通知端口);
var clients=新数组();
io.sockets.on(“连接”,功能(套接字){
socket.on(“\标识”),函数(消息){
if(message.id){
log(“会话id为“+message.id+”已连接的用户”);
var sockets=clients[message.id];
如果(!套接字){
套接字=新数组();
}
插座。推(插座);
客户端[message.id]=套接字;
}
});
});
var url=require('url');
var oakListener=require('http').createServer(函数(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
var url_parts=url.parse(req.url,true);
var query=url\u parts.query;
var sockets=clients[query.id];
if(插座){
对于(变量i=0;i
您必须为断开连接添加一个处理程序,如下所述:

socket.on('disconnect', function () {
    //delete socket from sockets;
});

问题是,连接几乎每分钟都会丢失。您必须在“断开连接”函数中收集数据,并在“连接”函数中重新初始化连接