[英]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.