0

PHP ベースのフォーラムにライブ機能を追加したいと考えています。新しい投稿は、作成されるとすぐにユーザーに自動的に表示されます。

私が少し混乱しているのは、PHP コードと NodeJS+socket.io の間の相互作用です。

新しい投稿についてNodeJSサーバーに通知し、投稿が投稿されたスレッドを見ているクライアントにサーバーに通知させるにはどうすればよいですか?

編集

次のコードを試してみましたが、うまくいくようです。私の唯一の質問は、これが良い解決策と見なされるかどうかです。

私は socket.io を使用してポート 81 でクライアントをリッスンし、ポート 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 アプリは単にcurlを使用POSTしてノード サーバーに接続し、ノード サーバーはメッセージを socket.io にプッシュします。

ただし、HTTP サーバーの実装は壊れています。dataイベントはイベントStreamです。ストリームはメッセージを送信せず、データのチャンクを送信します。つまり、要求エンティティ データは分割され、2 つのチャンクに送信される場合があります。

dataイベントがデータの部分的なチャンクを発行した場合、ほぼJSON.parse確実に例外がスローされ、ノード サーバーがクラッシュします。

データを手動でバッファリングするか、(私の推奨) Expressのような HTTP サーバーにより堅牢なフレームワークを使用する必要があります。

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://localhost:82/post/1234 に投稿する必要がありますcontent。(JSON、URL エンコード、またはマルチパート エンコードされたエンティティを使用できます。) ファイアウォールがパブリック インターフェイスのポート 82 をブロックしていることを確認してください。

于 2013-02-26T16:10:29.547 に答える
1

PHP コード/フォーラムと Node.JS との対話に関しては、おそらく、フォーラムに加えられた変更をリッスンできる種類の API エンドポイントを作成する必要があります。フォーラム ソフトウェアによっては、新しい投稿を作成するプロセスにフックし、この時点で Node.js への API コールバックを実行する必要があります。

すぐに使用できる Socket.io は、Javascript を介してフロントエンドに接続されているサイトの訪問者を対象としています。ノード サーバーが新しい投稿の更新の通知を受信すると、接続されたクライアントにこの新しい投稿とその詳細を通知します。その時点で、おそらく訪問者が表示しているページの DOM に新しい HTML が追加されます。

ユーザーが「subforum123」などの特定の部屋にいることによって発行される特定のイベントのみをサブスクライブし、該当する投稿の通知のみを受信するように、Socket.io の部分を調整することができます。

于 2013-02-26T05:21:38.693 に答える