【问题标题】:How does PHP, ZeroMQ, Socket io and Node Js actually work togetherPHP、ZeroMQ、Socket io 和 Node Js 究竟是如何协同工作的
【发布时间】:2019-11-10 06:57:16
【问题描述】:

我已经开始为我的实时体育比分更新构建 PHP 和 Node Js 应用程序。我的 php 和节点服务器可以与节点模块 express、socket io 和 zeromq 一起正常工作。我有一个从 API 接收的大数据,在我打包的 php 文件中,我将 json 数据发送到节点服务器(通过 zeromq),然后在节点 js 服务器文件中接收数据,从该文件发送到客户端。现在,该设置完全适用于少量数据。但是当它是大文件时,节点服务器无法进一步处理并出现以下错误。

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

node: ../node_modules/nan/nan.h:822: Nan::MaybeLocal Nan::NewBuffer(char*, size_t, node::Buffer::FreeCallback, void*): 断言`length

这是主要的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 聘请了几个节点 js 开发人员,但他们也无法解决问题。我希望这里有人能指导我正确的方向。

【问题讨论】:

    标签: php node.js socket.io zeromq


    【解决方案1】:

    来自关于缓冲区的 nodejs 文档 (https://nodejs.org/api/buffer.html)

    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 和 NodeJs 发送文件/行的 id。然后客户端必须调用 REST api 来获取实际数据。

    【讨论】:

    • 感谢您的回答。但是,假设我要发送一个大数组而不是多个数组,那么可能的解决方案是什么?我这样说是因为我正在向 json 发送一个包含 html 元素的大页面文件
    • 我更新了我的答案。如果您能向我们展示一些示例数据,那将非常有帮助。
    • 你可以在这里查看 json 数据run.sportsfier.com/json-data.php .. 它汇集在一个 json 对象中.. 我在 php 端发送它们的选项有限,是多个数组。我不确定我应该如何根据字符数将一个 json 对象拆分为多个数组。
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2017-01-10
    • 2017-05-12
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多