Доброго дня.
В очередной раз борюсь с непонятными моментами для меня в nodeJs. Сейчас столкнулся с ошибкой, которую опять же не могу решить самостоятельно и прошу помощи сообщества:
Пишу PHP приложение и решил некоторый функционал перенести на NodeJS в виду его производительности, гибкости и легкой масштабируемости.
Итак что есть:
— RPC Сервер на NodeJS. Связь с PHP организовал через модуль DNode который существует для обоих языков. Но PHP пока планирую использовать как клиент.
Итак NodeJS сторона:
require('epipebomb')()
require('./includes/array.js')
var dnode = require('dnode')
var net = require('net')
var request = require('request')
var tidy = require('tidy2')
var util = require('util')
var dom = require('xmldom').DOMParser
var server = net.createServer(function (c) {
var d = dnode({
mul: function (requestUrl,fields,callback){
request(requestUrl, function (error, response, body) {
console.log('Fetch url:'+requestUrl);
if (!error && response.statusCode == 200) {
var html=tidy.tidyString(body)
var doc = new dom().parseFromString(html)
for ( var key in fields ) {
var subfields = fields[key]
for(var subkey in subfields){
console.log(subfields[subkey])
//Include extensions for processing
require('./includes/'+subfields[subkey]+'.include.js')
global[subfields[subkey]](subkey,doc,requestUrl);
}
//Dummy
var array
callback(array);
}
}
})
}
})
c.pipe(d).pipe(c);
});
server.listen(5050)
и соответственно сторона PHP для вызова:
public function run($args){
require_once "extensions/DNode/DNode.php";
$dnode = new \DnodeSyncClient\Dnode();
$connection = $dnode->connect('localhost', 5050);
$fields=Fields::model()->findAll();
foreach($fields as $field){
$js_field[$field->name]=array($field->path=>$field->function);
}
$pages=Pages::model()->findAll();
foreach($pages as $page){
$response = $connection->call('mul', array($page->url,$js_field));
var_dump($response);
}
}
После нескольких дней поиска причины пришел к тому, что ошибка возникает только тогда когда обварачиваю все в Dnode. Т.е. если в Nodejs задать руками массивы, которые должны приходить из PHP то ошибки нет. Если же обварачиваю в удаленную процедуру то Nodа выкидывает ошибку
stream.js:81
throw er; // Unhandled stream error in pipe.
^
Error: write EPIPE
at errnoException (net.js:769:11)
at Object.afterWrite (net.js:593:19)
Пробовал искать, но многие ссылаются на epipebomb. Установив его проблема не решается.
Теоретически представляю что всего скорей проблема возникает из за рассинхронизации потоков, а DNode всего скорей расчитана на один поток (Запрос-Ответ)
В общем вопрос прост — кто сталкивался с связкой NodeJS+Php+Dnode и как заставить их работать?