PHPからnode.jsにメッセージを送信するには? PHPとnode.jsを実行しているLinuxサーバーがあります。
ユーザーが (php 経由で) トランザクションを完了したら、php から node.js にメッセージを送信したいと思います。その後、ノードはソケット接続を介してクライアントを更新します。
node.jsのパフォーマンスを損なうことなくphpからnode.jsに少量のデータを送信する良い方法は何ですか?
提案は、他のクライアントと同じように、HTTP インターフェイスを介してノードと通信することのようです。PHPでcURLを使用して、HTTP経由でノードと通信できます
特に、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:' ヘッダーを設定するなど、少し調査が必要でしたが、最終的に機能したときは非常に興奮しました。さらにサポートが必要な場合はお知らせください。
一番、
マット・パーディー
このような問題は、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 スクリプトが特定のチャット ルームのユーザーにメッセージをドロップする、より詳細な例もあります。
Redis のアプローチに関する私の個人的な印象: 扱いにくい。Apache、nodeJS、Redis という 3 つのサーバーを同じサーバーで実行する必要があります。また、PubSub のメカニズムは socket.io の発行とはかなり異なるため、既存のコードと互換性があるかどうかを確認する必要があります。
メッセージキューを使用してそれを行います。radis ( https://github.com/mranney/node_redis ) や 0mq ( http://zeromq.org/ )のような多くのソリューションがあります。サブスクライバーにメッセージを送信できます (たとえば、php から nodejs へ)。