2011-01-09 10 views
31

私はnode.jsに頭を抱えようとしています...Apache PHPと並んでnode.jsが実行されていますか?

私のLAMP設定は、現在自分の要求を満たしているので、とても満足しています。私は私のPHPアプリケーションにいくつかのリアルタイム機能を追加したいですが。現在自分のサイトにログインしているすべてのユーザーと可能なチャット機能を表示しています。

PHPバックエンドを置き換えたくありませんが、スケーラブルなリアルタイムソリューションが必要です。

1.アプリケーションサーバー側のスクリプト全体を再構築しなくても、node.jsをミックスに入れて自分のニーズを満たすことはできますか?

2. node.jsが私の「チャット」と「現在ログインしている」機能にどのように役立つのでしょうか?

あなたの意見を聞いて嬉しいです!

W.

答えて

22

side node.jsに沿ってSocket.ioを使用することをお勧めします。 libをインストールし、http://socket.io/からダウンロードしてください。あなたはそれをあなたのApacheサーバのそばに問題なく走らせることができます。

最初のノードサーバを作成します、

var http = require('http') 
    , url = require('url') 
    , fs = require('fs') 
    , io = require('../')//path to your socket.io lib 
    , sys = require(process.binding('natives').util ? 'util' : 'sys') 
    , server; 

server = http.createServer(function(req, res){ 
    var path = url.parse(req.url).pathname; 
}), 

server.listen(8084);//This could be almost any port number 

セカンドを使用して、コマンドラインからサーバーを実行します。

node /path/to/your/server.js 

第三に、クライアント側のJSを使用してソケットに接続します。

var socket = new io.Socket(null, {port: 8084, rememberTransport: false}); 
socket.connect(); 

また、socket.io libクライアント側も含める必要があります。

使用してノード・サーバにクライアント側からのデータを送信する:

socket.send({data:data}); 

あなたserver.jsも要求を処理する機能を持っている必要があります。

io.on('connection', function(client){ 
//action when client connets 

client.on('message', function(message){ 
    //action when client sends msg 
    }); 

    client.on('disconnect', function(){ 
    //action when client disconnects 
    }); 
}); 

をからデータを送信するには、主に二つの方法があります。クライアントへのサーバ:

client.send({ data: data});//sends it back to the client making the request 

および

client.broadcast({ data: data});//sends it too every client connected to the server 
+3

こんにちは、このすばらしい答えに感謝します。私はまだApacheの部分への接続について少し混乱しています。 Apacheの部分をより明確にするために、あなたの答えにいくつかのコメント/コードを追加してもよろしいですか? –

+1

同じ発信元ポリシーはどうですか?あなたはソケットioを使用して別のポートに電話をかけることはできませんか? – Zaptree

+0

助けてくれてありがとう助けてくれました –

2

私は、リスト内のチャットだけでなく、ログに記録されたが、Ajaxを経由して働くだろうと思います。

チャットの部分はNode.jsでプログラミングするのが簡単でしょう。mysql modulesのいずれかを使用して、既存のデータベースに接続してログイン情報などを照会し、Node.js、Iを介してすべてのチャットを行いますBrowser/Node.jsのコミュニケーションが本当に些細なものになるので、Socket.ioをチェックアウトすることをお勧めします。これにより、実際のチャットロジックに集中できるようになります。

また、いくつかのインスピレーションのために、Node.jsの「公式」chat demoを見ることができます。

現在のオンラインの部分がある限り、これは "最後のX分でアクティブな5人のユーザー"の行に沿って何かを表示することで実現するのは簡単ではありません。

もちろん、チャットサーバーに問い合わせて、そこからユーザーリストをホームページに表示するAjaxを簡単に追加できます。

あなたは完全に狂っていて、すべての訪問者のためにSocket.ioの接続を確立し、このように監視しますが、これは努力する価値があるのか​​疑問です。

+0

ポート80はすでにApacheで使用されているか、別のIPにバインドされているため、別のポートでnode.jsサーバーを強制的に実行することはできませんか?チャットサーバーと現在のウェブアプリと通信したいと思ったら、クロスドメインの問題に遭遇するだろう。私は間違っているかもしれないが、これは本質的に彼の質問だと思う。 –

+0

依存して、彼はURLを変更することなくそれを渡すことができるはずです:http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/ –

+2

興味深い発見。その投稿のコメントの1つは、反対のことを示唆しています。私。 node.jsがApacheに代わってプロキシを行うのではなく、別の方法で。 Apacheをnode.jsのプロキシとして使用すると、Apacheは要求ごとに新しいプロセスを生成し、それをnode.jsに転送します。 –

0

私は私のLAMPセットアップと一緒にWSS(セキュアのWebSocket)サーバーを実行していますよ。

Node.jsは、他のどのWebサーバー(Apache)でも簡単に実行できます。 @KitCarrauの例では、彼はノードを8084上で実行できるようにしています。これは、実行中でリッスンしている場所で、80や443などではありません(これらは通常Apacheによってとられます)。しかし、同じポートを使ってhttp/httpsサービスを提供することもできます(私の場合は、サービスが稼動しているという一般的な情報が記載されています)。

コンソールからの起動は、(リモートで、コンソールを閉じるときにノードが停止する)最善の方法ではありません。私はリアルタイムでログを追跡するためにRunning node as service

簡単でご覧になることをお勧めします (はconsole.log(「こんにちは」)でログインし、あなたのアプリケーションで)で:

tail -f /var/.../SocketServer.log 

サンプルスクリプト(リンパ節転移server80):

author ....  
description "node.js server"  
# used to be: start on startup 
# until we found some mounts weren't ready yet while booting: 

start on started mountall 
stop on shutdown 

# Automatically Respawn: 
respawn 
respawn limit 99 5 

# Max open files are @ 1024 by default. Bit few. 
limit nofile 32768 32768 

script 
    # Not sure why $HOME is needed, but we found that it is: 
    export HOME="/root" 

    exec node /var/.../SocketServer.js >> /var/www/node/.../SocketServer.log 2>&1 
end script 

post-start script 
    # Optionally put a script here that will notifiy you node has (re)started 
    # /root/bin/hoptoad.sh "node.js has started!" 
    echo "\n*********\nServer started\n$(date)\n*********" >> /var/.../SocketServer.log 

end script 
関連する問題