2010-07-03 83 views
2

我正在使用node.js的連接能力來連續長時間輪詢一個php腳本,我想知道是否有人知道在node.js中鏈接到php的thoery(可能甚至是代碼示例) ?我想我需要一個新的客戶端,我添加一個PHP頁面的請求,然後添加一個響應事件偵聽器,然後觸發一個事件函數,捕獲返回的數據並將其返回到服務器功能。從node.js獲取PHP

但是,我是一個noob,需要一些初步的指導,因爲他們的api文檔不是最容易閱讀的;英文太羅嗦了,它是黑色背景上的白色字體......不太好。

感謝,

+1

使用節點從PHP腳本中獲取數據與節點的目的相矛盾,這是爲了避免使用服務器資源像PHP和其他Web服務器語言(如Python/Ruby)通常會這樣做。 – selfawaresoup 2010-07-29 13:44:35

+2

這可能是這樣,但是與使用諸如Apache這樣的服務機制相比,它不會更快更有效地服務PHP嗎?很顯然,最理想的情況是node.js直接回答請求,但沒有理由不能用它來克服apache自己的缺點...... – 2011-02-23 20:03:16

回答

3
var sys = require('sys'), 
    http = require('http'), 
    url = require("url"), 
    path = require("path"), 
    events = require("events"); 

var twitter_client = http.createClient(80, "192.168.23.128"); 

var tweet_emitter = new events.EventEmitter(); 

function get_tweets() { 
var request = twitter_client.request("GET", "/?url=ajax/session", {"host": "192.168.23.128"}); 

request.addListener("response", function(response) { 
    var body = ""; 
    response.addListener("data", function(data) { 
     body += data; 
    }); 

    response.addListener("end", function() { 
     sys.puts(body); 
     var tweets = JSON.parse(body); 
     if(tweets.length > 0) { 
      tweet_emitter.emit("tweets", tweets); 
     } 
    }); 
}); 

request.end(); 
} 

setInterval(get_tweets, 5000); 


http.createServer(function (req, res) { 
sys.puts("accessed Server"); 

res.writeHead(200, {'Content-Type': 'text/plain', "Access-Control-Allow-Origin": "*"}); 

var t = JSON.stringify({id:"test"}); 

var listener = tweet_emitter.addListener("tweets", function(tweets) { 
    res.write(tweets); 
}); 

res.write(t); 
    res.end(); 
}).listen(8124); 
sys.puts('Server running at http://127.0.0.1:8124/'); 

這似乎工作。從其他教程的混合使用

+0

自從您找到此解決方案後,您是否進一步發展了此代碼?很高興看到您可能提出的任何新提示。 – 2011-02-23 20:04:14

2

剛剛對此主題進行了一些研究,並希望爲任何可能希望執行相同操作的人提供答案。

對OP的評論很好的說明了這種事情是否會對資源有效利用,或者浪費節點基於事件的處理能力。我認爲將請求傳遞給Apache/PHP服務器會效率低下,因爲你本質上與發送給Apache服務器的循環AJAX請求做同樣的事情。唯一的區別是你現在有一箇中間人發送請求。

Apache仍然像往常一樣提供請求,它只是將它們提供給Node.js服務器而不是客戶端。這不會產生任何效率,除了從客戶端上取下一些負載並將其放置在服務器上。

正如@Paul提到的那樣,正確的做法是使用某種PHP處理器,它可以繞過Apache。有一些使用FastCGIPHP-FPM來完成這項工作的奇特方法 - 它們非常高,所以您可能在自己將它們集成到Node.js時遇到了一些麻煩。

在光明的一面,有一個節點模塊已經被構建來做到這一點:node-php。它非常年輕(「omega-alpha-super-beta-proof-of-concept」),但可能能夠處理你想要做的事情。如果它不能,至少這是一個很好的起點,你可以分叉以做出自己的增加