PHP,ZeroMQ,Socket io和Node Js如何实际协同工作

时间:2019-06-28 09:59:07

标签: php node.js socket.io zeromq

我已经开始构建PHP和Node Js应用程序以更新我的实时运动成绩。我的php和节点服务器与节点模块express,socket io和zeromq正常工作。我有一个从API接收到的大数据,在该文件中,我打包了php文件,并将json数据发送到节点服务器(通过zeromq),然后在节点js服务器文件中接收了该数据,该数据是从该节点发送到客户端的。现在,该设置可以很好地处理少量数据。但是,当文件很大时,节点服务器将无法继续处理,并显示以下错误。

这是我尝试通过节点服务器中的套接字io发送到客户端时遇到的错误

节点:../node_modules/nan/nan.h:822:Nan :: MaybeLocal Nan :: NewBuffer(char *,size_t,node :: Buffer :: FreeCallback,void *):断言`length <= imp :: kMaxLength && “缓冲区太大””失败。 中止(核心已弃用)

这是主要的node_socket.js

  var express = require('express'); 
  var app = express();
  var fs = require('fs');

  var options = {
  key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem'),
  ca: fs.readFileSync('/etc/letsencrypt/live/example.com/chain.pem')
 };

 var https = require('https').Server(options, app);

  var zmq = require('zeromq')
 , sock = zmq.socket('pull');
sock.bind('tcp://10.150.0.6:1111');

var io = require('socket.io')(https); 

io.on('connection', function(socket){ 

socket.on('disconnect',function(){
    console.log("client disconnected");
})  

sock.on('message',function(msg){    
 console.log('work: %s', msg.toString());   
 socket.emit('latest_score',msg.toString());    

});     

 });

 https.listen(3333);
 sock.on('connect', function(fd, ep) {console.log('connect, endpoint:', ep);});

 console.log('App connected to port 3333');

请注意,该应用程序可以很好地处理小数据,但无法处理从php文件发送的大json数据。几天以来,我尝试了几种不同的方法,但是都没有成功。我还从fiverr.com雇用了几个node js开发人员,但他们也无法解决问题。我希望这里有人会指引我正确的方向。

1 个答案:

答案 0 :(得分:1)

摘自缓冲区(https://nodejs.org/api/buffer.html)上的nodejs文档

buffer.constants.MAX_LENGTH#
Added in: v8.2.0
<integer> The largest size allowed for a single Buffer instance.
On 32-bit architectures, this value is (2^30)-1 (~1GB). On 64-bit architectures, this value is (2^31)-1 (~2GB).

This value is also available as buffer.kMaxLength.

因此,假设您使用的是64位系统,则您似乎一次发送了2GB以上的数据。假设您有一个很大的JSON数据数组,最简单的方法是将数组拆分为多个块,然后分别通过套接字发送它们。

所以在这里:

sock.on('message',function(msg){    
   console.log('work: %s', msg.toString());   
  socket.emit('latest_score',msg.toString());    
}); 

您需要JSON.parse()数据,将其拆分,JSON.stringify()数据并分别通过套接字发送。

在此处查看如何拆分数组:Split array into chunks

更新:(由于评论) 如果您绝对不能拆分数据,则可以将其存储在php(数据库或文件)中,并构建REST api来查询数据。然后只需通过ZeroMQ和NodeJ发送文件/行的ID。然后,客户端必须调用REST API来获取实际数据。