如何通知使用PHP的东西的NodeJS服务器?
我想为基于PHP的论坛添加一个实时功能 - 新帖子将在创建后立即自动显示给用户。如何通知使用PHP的东西的NodeJS服务器?
我觉得有点混乱的是PHP代码和NodeJS + socket.io之间的交互。
我该如何去通知NodeJS服务器关于新帖子并让服务器通知正在观看帖子发布的线程的客户端?
编辑
尝试下面的代码,它似乎工作,我唯一的问题是,这是否被认为是一个很好的解决方案,因为它看起来有点凌乱我。
我使用socket.io在端口81上侦听客户端,运行om端口82的服务器仅供论坛使用 - 当创建新的帖子时,PHP脚本向本地主机发送POST请求在端口82上,连同数据。
可以吗?
var io = require('socket.io').listen(81);
io.sockets.on('connection', function(socket) {
socket.on('init', function(threadid) {
socket.join(threadid);
});
});
var forumserver = require('http').createServer(function(req, res) {
if (res.socket.remoteAddress == '127.0.0.1' && req.method == 'POST') {
req.on('data', function(chunk) {
data = JSON.parse(chunk.toString());
io.sockets.in(data.threadid).emit('new-post', data.content);
});
}
res.end();
}).listen(82);
你在一个特殊的端口上运行的HTTP服务器的解决方案正是我遇到类似问题时所遇到的解决方案。 PHP应用程序简单地使用curl到POST
到节点服务器,然后将消息推送到socket.io。
但是,您的HTTP服务器实现已损坏。 data
事件是Stream
事件;流不发送消息,它们发出数据块。换句话说,可以将请求实体数据拆分并以两个块发送。
如果data
事件发出部分数据块,JSON.parse
几乎肯定会抛出异常,并且您的节点服务器将崩溃。
你要么需要手动buffer data,或(我的建议)使用更强大的框架,为您的HTTP服务器一样Express:
var express = require('express'), forumserver = express();
forumserver.use(express.bodyParser()); // handles buffering and parsing of the
// request entity for you
forumserver.post('/post/:threadid', function(req, res) {
io.sockets.in(req.params.threadid).emit('new-post', req.body.content);
res.send(204); // HTTP 204 No Content (empty response)
});
forumserver.listen(82);
PHP只需要发布到http ://本地主机:82 /后/ 1234与实体正文包含content
。(可以使用JSON,URL编码或多部分编码的实体。)确保您的防火墙阻止公共接口上的端口82。
关于PHP代码/论坛与Node.js的互动,你可能需要创建一个可以监听到论坛上所做的更改各种各样的API端点。根据您的论坛软件,您可能想要挂钩创建新帖子的过程,并在此时对Node.js执行API回调。
开箱即用的Socket.io适用于通过Javascript前端连接的网站的访问者。在Node服务器接收到新的更新后通知后,它会通知连接的客户端这个新帖子及其详细信息,此时它可能会向访问者正在查看的页面的DOM添加新的HTML。
您可能要安排的事情Socket.io一部分,这样用户只订阅诸如“subforum123”他们在特定的房间是被发射的特定事件,这样就可以只收到适用帖子的通知。
谢谢,我的问题是我如何实际执行Node.js的API回调?我的一个想法是使用仅由论坛软件使用的事件(Node.js服务器将确保客户端的IP与论坛的IP相同),然后进行广播。我想这很麻烦,我确信有一个更好的方法来实现这一点。 – Lior 2013-02-26 14:19:14
谢谢,这是有道理的。我应该将这两台服务器放在同一个文件中,还是应该将它们分成两个文件,最后是两个node.js实例? – Lior 2013-02-26 16:37:52
您需要一个Node实例,但这并不意味着您必须在单个文件中进行everyhing。在你的主app.js中,require('./ forumserver.js')(io);'。将论坛服务器的东西移动到那个文件中,并用'exports = module.exports = function(io){...}包装它' – josh3736 2013-02-26 16:51:28
明白了,谢谢! – Lior 2013-02-26 16:56:45