22

PHPからnode.jsにメッセージを送信するには? PHPとnode.jsを実行しているLinuxサーバーがあります。

ユーザーが (php 経由で) トランザクションを完了したら、php から node.js にメッセージを送信したいと思います。その後、ノードはソケット接続を介してクライアントを更新します。

node.jsのパフォーマンスを損なうことなくphpからnode.jsに少量のデータを送信する良い方法は何ですか?

4

6 に答える 6

26

提案は、他のクライアントと同じように、HTTP インターフェイスを介してノードと通信することのようです。PHPでcURLを使用して、HTTP経由でノードと通信できます

参照: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc/216933a076ac2595?pli=1

特に、Matt Pardee のこの投稿を参照してください。

私は、バグに追加された新しいメモをユーザーに知らせ続けたいという同様の問題に直面しました。同様の通知は、実際には PHP から Node サーバーにしか効果的に送信できませんでした。私がしたことは次のとおりです (送信時にこれがすべて文字化けしてフォーマットされていない場合はお詫びします。そうであれば、喜んでコードを別の場所に貼り付けます): まず、PHP から cURL を使用する必要があります。クラスの関数を次のように書きました。

function notifyNode($type, $project_id, $from_user, $data) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1');

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    curl_setopt($ch, CURLOPT_PORT, 8001);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);

    curl_setopt($ch, CURLOPT_POST, true);

    $pf = array('f' => $type, 'pid' => $project_id, 'user_from' => $from_user, 
             'data' => array());

    foreach($data as $k => $v) {
        $pf['data'][$k] = $v;
    }

    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pf));

    curl_exec($ch);
    curl_close($ch);
}

PHP と NodeJS の両方が同じサーバーで実行されているため、同じサーバーで cURL 要求を送信していることに気付くでしょう。このコードが接続するように設定したポートは 8001 です (これは、Node サーバーが実行されているポートであり、socket.io サーバーが接続するポートです)。これにより、post フィールドがエンコードされた HTTP POST リクエストが送信されます。これはすべてかなり標準的な cURL のものです。

Node アプリには、おそらく次のようなものがあります。

var server = http.createServer(function(req, res) {});
server.listen(8001);
var io = io.listen(server, { transports: ['websocket', 'flashsocket', 'xhr-polling'] });

...

ここで行うことは、http.createServer 部分を展開して、ローカル ホスト ("127.0.0.1") からの接続をリッスンすることです。createServer コードは次のようになります。

var server = http.createServer(function(req, res) {
    // Check for notices from PHP
    if(res.socket.remoteAddress == '127.0.0.1') {
        if(req.method == 'POST') {
            // The server is trying to send us an activity message

            var form = new formidable.IncomingForm();
            form.parse(req, function(err, fields, files) {

                res.writeHead(200, [[ "Content-Type", "text/plain"]
                        , ["Content-Length", 0]
                        ]);
                res.write('');
                res.end();

                //sys.puts(sys.inspect({fields: fields}, true, 4));

                handleServerNotice(fields);                
            });
        }
    }
});

そこから、handleServerNotice 関数を実装できます。

function handleServerNotice(data) {
        ...
}

などなど。しばらくこれをテストしていませんでした。実際、ノードサーバーでコードブロックがコメントアウトされていたので、ここに貼り付けたものが機能することを願っています-一般に、この概念は証明されており、うまくいくと思いますあなたのために働きます。とにかく、数か月経っていることを知ってもらいたかったので、コメントアウトした理由が正確にはわかりません. 私が書いたコードは、cURL で 'Expect:' ヘッダーを設定するなど、少し調査が必要でしたが、最終的に機能したときは非常に興奮しました。さらにサポートが必要な場合はお知らせください。

一番、

マット・パーディー

于 2012-04-06T20:44:23.287 に答える
5

このような問題は、Express フレームワークを使用するだけで簡単に解決できることがわかりました。php が json メッセージをノードサーバーに送信し、サーバーが ok で応答するとします。

app.js 内

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var bodyParser = require('body-parser')
app.use(bodyParser.json());

app.post('/phpcallback', function(req, res) {
    var content = req.body;
    console.log('message received from php: ' + content.msg);
    //to-do: forward the message to the connected nodes.
    res.end('ok');
});

http.listen(8080, function(){
  var addr = http.address();
  console.log('app listening on ' + addr.address + ':' + addr.port);
});

test.php で

<?php

$data = array("name" => "Robot", "msg" => "Hi guys, I'm a PHP bot !");                                                                    
$data_string = json_encode($data);

$ch = curl_init('http://localhost:8080/phpcallback');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

echo curl_exec($ch)."\n";
curl_close($ch);

?>

ここには、php スクリプトが特定のチャット ルームのユーザーにメッセージをドロップする、より詳細な例もあります。

https://github.com/lteu/chat


Redis のアプローチに関する私の個人的な印象: 扱いにくい。Apache、nodeJS、Redis という 3 つのサーバーを同じサーバーで実行する必要があります。また、PubSub のメカニズムは socket.io の発行とはかなり異なるため、既存のコードと互換性があるかどうかを確認する必要があります。

于 2015-08-19T21:03:07.987 に答える
1

メッセージキューを使用してそれを行います。radis ( https://github.com/mranney/node_redis ) や 0mq ( http://zeromq.org/ )のような多くのソリューションがあります。サブスクライバーにメッセージを送信できます (たとえば、php から nodejs へ)。

于 2015-02-20T16:35:52.477 に答える