Как на самом деле работают PHP, ZeroMQ, Socket io и Node Js - PullRequest
0 голосов
/ 28 июня 2019

Я начал создавать приложения для 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 *): длина утверждения <= imp :: kMaxLength &&«слишком большой буфер» не удалось.Прервано (ядро сброшено) </p>

Это основной 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');

Обратите внимание, что приложение отлично работает с небольшими данными, но просто не может обрабатывать большие данные JSON, отправляемые изphp файлНесколько дней я пробовал разные вещи, но безрезультатно.Я также нанял несколько разработчиков js-сайтов с fiverr.com, но они также не смогли решить проблему.Я надеюсь, что кто-то здесь направит меня в правильном направлении.

1 Ответ

1 голос
/ 28 июня 2019

Из документации 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-битной системе, кажется, что вы отправляете более 2 ГБ данных одновременно. Предполагая, что у вас большойJSON Массив данных проще всего было бы разбить массив на куски и отправить их через сокет индивидуально.

Итак, здесь:

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

вам нужно JSON.parse ()данные, разделите их, JSON.stringify () и отправьте по отдельности через сокет.

Смотрите здесь, как разбить массив: Разбить массив на куски

Обновление: (из-за комментариев) Если вы абсолютно не можете разделить данные, вы можете сохранить их в php (в базе данных или в файле) и создать REST API для запроса данных. Затем просто отправьте идентификатор файла/ строка через ZeroMQ и NodeJs. Затем клиент должен вызвать API REST для получения фактических данных.

...