簡體   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