在node.js套接字服务器脚本中运行php代码

在node.js套接字服务器脚本中运行php代码,php,javascript,node.js,Php,Javascript,Node.js,我正在javascript中运行一个普通的TCP套接字,并使用节点执行。在将响应发送回客户端之前,我想用一些php(mysql)代码验证数据。 如何在这个javascript文件中执行此代码?STACKOVERFLOW中的所有类似问题都会在HTML中询问此代码。(这没关系,我理解这一部分),但这是一个普通的javascript文件(在node中执行)。下面是javascript代码,我已经标记了验证函数调用 var net = require('net'); var HOST = '192.1

我正在javascript中运行一个普通的TCP套接字,并使用节点执行。在将响应发送回客户端之前,我想用一些php(mysql)代码验证数据。 如何在这个javascript文件中执行此代码?STACKOVERFLOW中的所有类似问题都会在HTML中询问此代码。(这没关系,我理解这一部分),但这是一个普通的javascript文件(在node中执行)。下面是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);
ValidateScant执行一行lke:

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

但这不起作用。如何从javascript文件中调用这个“geteriod.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);
php应该从stdin读取并写入stdout

<?

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

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

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

?>


另一个选项是用于与php节点通信。或者只需使用http并从nginx/apache(甚至)运行php,这是一种为澄清和“启动”提供更通用答案的方法:

据我所知,您正试图使用node.js服务器调用的http post请求运行php脚本

您可能首先必须意识到这样一个事实:运行服务器端JavaScript通常与在浏览器中运行JS有不同的动机、可能性以及对体系结构的影响——至少在经典的“jQuery意义上”

正如您在评论中所述,您希望jQuery能够在服务器端node.js中无缝工作。这不起作用,因为发布的注释
ReferenceError:$未定义。node.js堆栈中没有现成的服务器端jQuery(使用jQuery服务器端的可能性应单独讨论,这是另一个主题)

尽管如此,您显然在寻找一种方法来重新使用PHP脚本,该脚本已经处理了mysql数据连接,并通过利用它在服务器端进行处理。使用http执行此操作可能会出现如下所示或。如果您的php脚本与node.js运行在同一台服务器(或更好的运行时环境)上,您也可以直接执行php脚本,方法是使用php standalone(命令行)实用程序将其作为子进程生成

最后但并非最不重要的一点:是的,有一些方法(npm模块、ORM层)可以将mysql直接连接到node.js应用程序。但这是另一个复杂的话题,在其他地方也有讨论


我希望这有助于避免混淆不该混淆的内容。

PHP中有一个PHP扩展。

@DainisAbols:Im lost。这没有道理吗?重命名php文件将如何使其执行。我得到的错误是$。未定义。
普通javascript文件(在节点中执行)
-您是指中的node.js吗?请帮助我们解释
$.post
基于什么(lib?看起来像jQuery,在这里没有意义)以及实际执行结果如何(有错误吗?)。据我所知,您正试图使用node通过服务器端http请求调用php脚本。因此,某种带有php处理程序的http服务器必须能够响应此请求。该网页为我做了所有这些php(mysql)验证,效果很好,但我想将此验证转移到javascript中的服务器应用程序。现在,我正在寻找一种将php文件的结果转换成javascript的方法。您是如何将jQuery与node.js集成的?再说一次:node.js应用程序的任何错误输出…?我很高兴试一试。我试过后会告诉你的。谢谢此代码导致内存使用量不断增加。。这很奇怪啊,好吧-正如我看到的@Andrey Sidorov提供了一个生成php子进程的解决方案:)。霍普,你现在就开始运转了。