PHP、ZeroMQ、Socket io 和 Node Js 是如何协同工作的
How does PHP, ZeroMQ, Socket io and Node Js actually work together
我已经开始为我的实时体育比分更新构建 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*): 断言`长度 <= imp::kMaxLength &&
"too large buffer"' 失败。
已中止(核心已转储)
这是主要的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 开发人员,但他们也无法解决问题。我希望这里有人能指导我正确的方向。
来自关于缓冲区的 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 发送 file/row 的 id。然后客户端必须调用 REST api 来获取实际数据。
我已经开始为我的实时体育比分更新构建 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*): 断言`长度 <= imp::kMaxLength && "too large buffer"' 失败。 已中止(核心已转储)
这是主要的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 开发人员,但他们也无法解决问题。我希望这里有人能指导我正确的方向。
来自关于缓冲区的 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 发送 file/row 的 id。然后客户端必须调用 REST api 来获取实际数据。