Запуск php-кода внутри скрипта сервера сокетов node.js

Я использую обычный сокет TCP в JavaScript и использует узел для выполнения. Прежде чем отправить ответ клиенту, я хочу проверить данные с помощью некоторого кода php (mysql). Как я могу выполнить этот код внутри этого файла JavaScript? Все похожие вопросы в STACKOVERFLOW задает этот код в HTML. (что хорошо, и я понимаю эту часть), но это обычный файл javascript (выполняется в узле). Ниже приведен код JavaScript, и я пометил вызов функции проверки.

var net = require('net');

var HOST = '192.168.0.6';
var PORT = 8765;

net.createServer(function(sock) {

    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

    sock.on('data', function(data) {
        var output;
        var validScan;

        //This is the function call to a php file
        **validScan = validateScanTag(data);**

        console.log('DATA ' + sock.remoteAddress + ': ' + data);
        sock.write(validScan);

    });

    // Closing this instance of socket
    sock.on('close', function(data) {
        console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
    });

}).listen(PORT, HOST);

console.log('Server listening on ' + HOST +':'+ PORT);

ValidateScanTag выполняет строку lke:

$.post('getperiod.php', {hours:hrs, minutes:mins, seconds:secs, ddd:day},

Но это не работает. Как я могу вызвать этот файл 'geteriod.php' из файла JavaScript?

 Brad23 окт. 2012 г., 09:00
@VolkerK: Да, node.js
 Peon23 окт. 2012 г., 08:44
кgotPeriod.php
 VolkerK23 окт. 2012 г., 08:56
normal javascript file (executed in node) - вы имеете в виду node.js как вnodejs.org ?
 Brad23 окт. 2012 г., 08:43
@DainisAbols: переименовать в?
 Brad23 окт. 2012 г., 08:50
@DainisAbols: Я потерян. Это не имеет смысла? Как переименование моего php файла заставит его работать. Ошибка, которую я получаю, говорит что-то вроде $. не определен.

Ответы на вопрос(3)

чтобы дать более общий ответ для разъяснения и «получить вас в сапогах»:

Насколько я понимаю, вы пытаетесь запустить свой php-скрипт, используя http-запрос, вызванный сервером node.js.

Вам, вероятно, сначала нужно осознать тот факт, что выполнение JavaScript на стороне сервера обычно имеет другую мотивацию и возможности, а также влияние на вашу архитектуру, чем запуск JS внутри браузера - по крайней мере, в классическом «смысле jQuery».

Как указано в вашем комментарии, вы ожидаете, что jQuery будет бесперебойно работать в узле server.js. Это не работает как комментарийReferenceError: $ is not defined показывает вам. В вашем стеке node.js нет серверной jQuery, работающей "из коробки" (возможности использования jQuery на стороне сервера должны обсуждаться отдельно, и это еще одна тема).

Тем не менее, вы, очевидно, ищете способ повторно использовать ваш PHP-скрипт, который уже обрабатывает ваше соединение с данными MySQL и обрабатываетиспользуя его на стороне сервера, Делая этоиспользуя http Есть возможности, как показанов этом сообщении или жев разделе http.request документации по node.js, Если ваш php-скрипт находится на том же сервере (или в лучшей среде выполнения), где работает ваш node.js, вы также можетенапрямую выполнить скрипт php порождая его как дочерний процесс с помощью утилиты php standalone (командной строки).

Последнее, но не менее важное: да, есть несколько способов (модули npm, слои ORM) для непосредственного подключения mysql к вашему приложению node.js. Но это еще одна сложная тема, которая обсуждается в других местах.

Я надеюсь, что это помогло избежать путаницы.

 matthias23 окт. 2012 г., 12:19
Ах, хорошо - как я вижу @ Андрей Сидоров предоставил решение для запуска дочернего процесса php :). Надеюсь, сейчас все готово.

что сама проблема стоит переосмыслить (например, перенести код mysql с php на узел), но вот мое решение:

var net = require('net');
var PORT = 8765;
var Lazy=require('lazy');
var spawn = require('child_process').spawn;

// php code runs as a server in external process

var validator = spawn('php', ['validator.php']);

net.createServer(function(sock) {

    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

    // on 'data' handler is not enough to read input line by line
    // you need to buffer data, use some kind of state machine or one of available stream parsers. I use lazy here: npm install lazy

    // write each line to php validation code
    new Lazy(sock).lines.forEach(function(line) {
        console.log('DATA ' + sock.remoteAddress + ': ' + line.toString());
        validator.stdin.write(line);
        validator.stdin.write('\n');
    });

    // read validation result line by line from validator process
    new Lazy(validator.stdout).lines.forEach(function(line) {
        console.log('Validation result:' + line.toString()) // line is Buffer object here, hence toString
    });

    validator.stdout.pipe(process.stdout);

    // Closing this instance of socket
    sock.on('close', function() {
        console.log('CLOSED');
    });

}).listen(PORT);

validator.php должен читать из стандартного ввода и писать в стандартный вывод

<?

function validatescanTag($l) {
    // put your validation code here
    return $l . '!!!!';
}

$stdin = fopen('php://stdin', 'r');

do {
  $line = fgets($stdin);
  print validateScanTag($line);
} while(1);

?>

Другой вариант заключается в использованиипротокол fastcgi связать узел <-> php илиdnode rpc, Или просто используйте http и запустите php из nginx / apache (или дажеУзел-PHP)

 Brad23 окт. 2012 г., 12:03
Я взволнован, чтобы попробовать. Даст вам знать, как только я попробую это. Спасибо!!!!!!
 StefanoCudini23 мая 2014 г., 03:49
этот код вызывает растущее использование памяти .. это странно

Ваш ответ на вопрос