2010-07-03 3 views
2

Я работаю над тем, чтобы использовать возможности соединения node.js для непрерывного длительного опроса php-скрипта, и мне было интересно, знает ли кто-нибудь о том, что происходит (возможно, даже пример кода), связанного с php в node.js ? Я думал, что мне нужен новый клиент, и я добавляю запрос на php-страницу, а затем добавляю прослушиватель событий ответа, который затем запускает функцию события, которая захватывает возвращенные данные и перебрасывает их обратно в функцию сервера.Получение PHP from node.js

Я, однако, нуб и нуждаюсь в каком-то начальном руководстве, так как их документация api не является самой простой для чтения; английский слишком многословен, а белый шрифт на темном фоне ... не приятно.

Спасибо,

+1

Использование узла для получения данных из сценария PHP противоречит назначению узла, чтобы избежать использования ресурсов сервера например, PHP и другие языки веб-сервера, такие как Python/Ruby. – selfawaresoup

+2

Это может быть так, но не будет ли еще быстрее и эффективнее обслуживать PHP, чем использовать сервисный механизм, такой как Apache? Очевидно, что наиболее идеальной ситуацией будет то, что node.js отвечает на запросы напрямую, но нет причин, по которым он не может быть использован для преодоления собственных недостатков Apache ... –

ответ

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

Вы уже развили этот код с тех пор, как нашли это решение? Было бы неплохо увидеть новые подсказки, которые вы, возможно, придумали. –

2

Проводил некоторое исследование по этой теме и хотел ответить на вопрос для тех, кто мог бы сделать то же самое.

В комментариях к ОП были высказаны соображения относительно того, действительно ли это будет эффективным использованием ресурсов или потерей возможностей обработки событий на основе событий. Я бы сказал, что передача запросов на сервер Apache/PHP будет неэффективной, потому что вы по существу делаете то же самое, что и повторяющийся запрос AJAX, отправленный на сервер Apache. Единственное различие заключается в том, что теперь у вас есть человек в середине отправки запросов.

Apache все еще обслуживает запросы так же, как и всегда, он просто служит им для сервера Node.js, а не для клиента. Это не способствует повышению эффективности, за исключением того, что требуется небольшая загрузка клиента и размещение его на сервере.

Правильный способ сделать это, как сказал @Paul, - использовать какой-то процессор PHP, который позволит вам обойти Apache. Есть некоторые причудливые методы для этого, используя FastCGI и PHP-FPM - они довольно высокого уровня, поэтому у вас могут возникнуть проблемы с их объединением в Node.js по своему усмотрению.

С яркой стороны уже создан модуль узла, который может выполнять только это: node-php. Это довольно молодая («omega-alpha-super-beta-proof-of-concept»), но может справиться с тем, что вы пытаетесь сделать. Если это невозможно, по крайней мере, это хорошая отправная точка, и вы можете отказаться от своих собственных дополнений.

Смежные вопросы