【问题标题】:How to inform a NodeJS server of something using PHP?如何使用 PHP 通知 NodeJS 服务器?
【发布时间】:2013-02-25 23:49:50
【问题描述】:

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

我觉得有点困惑的是 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);

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

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

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

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

    您要么需要手动 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 只需要使用包含content 的实体主体发布到 http://localhost:82/post/1234。 (可接受 JSON、URL 编码或多部分编码的实体。)确保您的防火墙在您的公共接口上阻止端口 82。

    【讨论】:

    • 谢谢,这是有道理的。我应该将两台服务器放在同一个文件中,还是应该将它们拆分为两个文件,从而生成两个 node.js 实例?
    • 您需要一个 Node 实例,但这并不意味着您必须将所有内容都放在一个文件中。在您的主 app.js 中,require('./forumserver.js')(io);。将论坛服务器的内容移动到该文件,并用exports=module.exports=function(io) { ... } 包装它
    • 很抱歉一直打扰您,但我遇到了另一个问题。每个论坛帖子都有基于用户权限的各种内容,例如删除帖子、批准帖子、审核帖子和查看发布者 IP 地址的能力。我可以为每个帖子的几个版本提供 Node 服务器,但是,我需要确定每个客户端的权限,这就是我遇到麻烦的地方。您建议如何处理?
    • @Lior:这深入到你的 PHP 应用程序的内部,不幸的是我怀疑有一个简单的答案。
    • 所以一般来说,就性能而言,我会更好地使用 Node.js 获取权限(这意味着连接到论坛数据库)还是在 PHP 向节点服务器?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,我的问题是如何实际执行对 Node.js 的 API 回调?我的一个想法是使用仅由论坛软件使用的事件(Node.js 服务器将确保客户端的 IP 与论坛的 IP 相同),然后进行广播。我想这有点乱,而且我确信有一种更简洁的方法可以实现这一点。
    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2018-02-07
    • 2017-09-07
    • 2020-07-23
    • 2016-01-01
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多