【问题标题】:Running php code inside a node.js socket server script在 node.js 套接字服务器脚本中运行 php 代码
【发布时间】:2012-10-23 06:39:07
【问题描述】:

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

【问题讨论】:

  • @DainisAbols:我迷路了。这根本不符合逻辑?重命名我的 php 文件将如何使其执行。我得到的错误说像 $.未定义。
  • normal javascript file (executed in node) - 你的意思是 nodejs.org 中的 node.js ?
  • 请帮助我们解释 $.post 是基于什么(lib?看起来像 jQuery,在这里没有意义)以及执行的实际结果如何(任何错误?)。据我了解,您正在尝试使用 node.js 通过服务器端 http 请求调用 php 脚本。因此,某种带有 php 处理程序的 http 服务器必须能够响应此请求。
  • 我在网页上使用过 $.post (jQuery yes) 是的。该网页为我完成了所有这些 php (mysql) 验证并且工作正常,但我想将此验证移动到 javascript 中的服务器应用程序。现在我正在寻找一种将 php 文件中的结果转换为 javascript 的方法。
  • 您是如何将 jQuery 与 node.js 集成的?再一次:从你的 node.js 应用程序输出任何错误...?

标签: php javascript node.js


【解决方案1】:

我很确定问题本身值得重新思考(例如,将 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 protocol 与节点 php 或dnode rpc 通信。或者只是使用 http 并从 nginx/apache 运行 php(甚至是 node-php

【讨论】:

  • 我很高兴能尝试一下。一旦我尝试过,会告诉你的。谢谢!!!!!!
  • 这段代码导致内存使用量增加..很奇怪
【解决方案2】:

一种为澄清和“让您做好准备”提供更通用答案的方法:

据我了解,您正在尝试使用 node.js 服务器调用的 http post 请求运行您的 php 脚本。

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

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

尽管如此,您显然正在寻找一种方法来重用您的 PHP 脚本,该脚本已经通过 在服务器端使用它来处理您的 mysql 数据连接和处理。这样做使用 http 有可能如 in this stackoverflow postin the http.request section of the node.js documentation 所示。如果您的 php 脚本与您的 node.js 运行在同一台服务器(或更好的运行时环境)上,您也可以直接执行 php 脚本,通过将其作为子进程与 php 独立 (命令行)实用程序。

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

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

【讨论】:

  • 啊,好吧 - 正如我所见,@Andrey Sidorov 提供了一个生成 php 子进程的解决方案:)。希望,您现在可以启动并运行。
【解决方案3】:

PHP中有一个PHP扩展embedding Chrome's V8 engine

【讨论】:

    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多