繁体   English   中英

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

[英]Running php code inside a node.js socket server script

我在javascript中运行一个普通的TCP套接字并使用node来执行。 在我将响应发送回客户端之前,我想用一些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},

但这不行。 如何从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);

validator.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);

?>

另一个选择是使用fastcgi协议来通信节点< - > php或dnode rpc 或者只使用http并从nginx / apache运行php(甚至是node-php

一种给出更通用的答案以澄清和“让你获得靴子”的方法:

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

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

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

然而,您显然正在寻找一种方法来重用PHP脚本,该脚本已经通过利用服务器端来处理您的mysql数据连接和处理。 使用http执行此操作可能会显示在此stackoverflow帖子node.js文档的http.request部分中 如果您的php脚本与node.js运行时位于同一服务器(或更好的运行时环境)上,您也可以通过使用php standalone(命令行)实用程序将其作为子进程生成, 直接执行php脚本

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

我希望这有助于避免混淆不应该混淆的事情。

有一个PHP扩展在PHP中嵌入了Chrome的V8引擎

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM