0

我想为基于 PHP 的论坛添加实时功能 - 新帖子一经创建就会自动显示给用户。

我觉得有点困惑的是 PHP 代码和 NodeJS+socket.io 之间的交互。

我将如何通知 NodeJS 服务器有关新帖子并让服务器通知正在观看帖子发布的线程的客户端?

编辑

尝试了以下代码,它似乎有效,我唯一的问题是这是否被认为是一个好的解决方案,因为它看起来有点乱。

我使用 socket.io 在端口 81 上监听客户端,而运行 om 端口 82 的服务器仅供论坛使用 - 当创建新帖子时,PHP 脚本会在端口 82 上向 localhost 发送 POST 请求,连同数据。

这个可以吗?

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);
4

2 回答 2

3

您在特殊端口上运行的 HTTP 服务器的解决方案正是我在遇到类似问题时最终得到的解决方案。PHP 应用程序只是使用curlPOSTNode 服务器,然后将消息推送到 socket.io。

但是,您的 HTTP 服务器实现已损坏。事件data就是Stream事件;流不发出消息,它们发出数据块。换句话说,请求实体数据可以被分成两个块并发出。

如果data事件发出部分数据块,JSON.parse几乎肯定会抛出异常,并且您的 Node 服务器会崩溃。

您要么需要手动缓冲数据,要么(我的建议)为您的 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 只需要使用包含content. (可接受 JSON、URL 编码或多部分编码的实体。)确保您的防火墙在您的公共接口上阻止端口 82。

于 2013-02-26T16:10:29.547 回答
1

关于 PHP 代码/论坛与 Node.JS 的交互,您可能需要创建一个 API 端点来监听对论坛所做的更改。根据您的论坛软件,您可能希望在此时加入创建新帖子的过程并执行对 Node.js 的 API 回调。

开箱即用的 Socket.io 面向通过 Javascript 在前端连接的网站访问者。在 Node 服务器收到新帖子更新的通知后,它会通知已连接的客户端这个新帖子及其详细信息,此时它可能会将新的 HTML 添加到访问者正在查看的页面的 DOM 中。

您可能希望安排事物的 Socket.io 部分,以便用户仅订阅他们在特定房间(例如“subforum123”)发出的特定事件,以便他们仅接收适用帖子的通知。

于 2013-02-26T05:21:38.693 回答