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

我在JavaScript中运行正常的TCP套接字,并使用节点执行。 在我向客户发回一个响应之前,我想用一些php(mysql)代码来validation数据。 我怎样才能执行此JavaScript文件内的代码? 在STACKOVERFLOW中的所有类似的问题在HTML中询问这个代码。 (这是好的,我明白这一部分),但这是一个正常的JavaScript文件(在节点执行)。 JavaScript代码如下,我已经标记了validation函数调用。

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}, 

但是这不工作。 我怎样才能从JavaScript文件调用这个'geteriod.php'文件?

我很确定这个问题本身是值得重新思考的(例如,把你的mysql代码从PHP移植到节点),但这里是我的解决scheme:

 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应该从标准input读取并写入标准输出

 <? function validatescanTag($l) { // put your validation code here return $l . '!!!!'; } $stdin = fopen('php://stdin', 'r'); do { $line = fgets($stdin); print validateScanTag($line); } while(1); ?> 

另一种select是使用fastcgi协议来通信节点< – > php或dnode rpc 。 或者只使用http并从nginx / apache(甚至node-php )运行php,

给出一个更通用的解释和“让你穿上靴子”的方法:

据我所知你正在尝试使用由node.js服务器调用的http post请求来运行你的php脚本。

您可能首先必须意识到,运行服务器端JavaScript通常具有不同的动机和可能性,以及影响您的体系结构,而不是在浏览器中运行JS – 至less在经典的“jQuery意义上”。

正如您在评论中所述,您期望jQuery能够在服务器端node.js中无缝工作。 这不起作用的评论发布ReferenceError: $ is not defined显示你。 在你的node.js堆栈中没有可用的服务器端jQuery,可以使用开箱即用(使用jQuery服务器端的可能性应该单独讨论,而且是另一个主题)。

尽pipe如此,你显然正在寻找一种方法来重新使用你的PHP脚本,它已经处理了你的mysql数据连接,并通过利用它服务器端进行处理 。 这样做使用http有可能像这个stackoverflowpost或在node.js文档的http.request部分中显示 。 如果你的php脚本和你的node.js运行在同一个服务器上(或者更好的运行时环境),你也可以通过php独立(命令行)实用工具将它作为一个subprocess产生, 直接执行php脚本

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

我希望这有助于避免混淆不应混淆的东西。

在PHP中embedded了Chrome的V8引擎 。