質問: とあるコミュニティサイト運営会社がPHPから、Node.jsに移植中で、エンジニア募集と採用ページに書いてあったのを見て、ふと思ったのですが、PHPとNode.jsとやらで出来ることにどんな違いがあるんでしょうか?
回答: hatopoppomamepoppoさん 、PHPとNODE.JS(javaScript)の比較ですね。 結局「NODE.JSの方が性能が良い」とは言えるのですが、評価観点は要注意です。 ・スループットによる比較では、同等 まず、javaScriptの代入文の書式となっているJSON形式データのダウンロードというJavaScriptで記述されたNode.JS側に有利な性能比較でも、下記URLのデータだと、PHPで記述されたサーバと タイシテ変わりません。 http://www.techempower.com/benchmarks/#section=data-r9&hw=i7&test=j... このサイトは、各種言語の使い手がインディレースのように、競って更新されている性能比較サイトです。 node.js(JavaScript)が 69,563回/秒 応答できたのに対して phpだと 67,366 69,563回/秒。 これらは、 第9ラウンドでは、偶々 僅差で、このような比較結果で、次のラウンドで入れ替わりそうな差しかありません。 でも、servlet(Java) 211,618回/秒の3分の1程度なので、当分javaを追い抜くことは無いでしょう。 ・応答時間では、高速なPHP風の環境を作ったチームも居るらしい 下記URLで、トップ性能になっているhhvmというのは、zendo社のPHPの代わるPHP風環境を作り、さらにJavaのように、JITコンパイラでネイティブなマシン語に変換しながら走る機能まで追加されています。 http://www.techempower.com/benchmarks/#section=data-r9&hw=i7&test=u... http://www.publickey1.jp/blog/13/facebookphpjithhvm_2217cpulinux.ht... 「FacebookがPHPのJITコンパイラ「HHVM 2.2」リリース。17%のCPU効率改善。Linuxディストリビューション用パッケージを用意」 でも、これはGPLライセンスなので、Facebook社以外には、使いにくいでしょう。 しかも、PHP風の記述言語が使えるだけで、100%zendo社のPHPと互換性があると保証されたものでもなさそうです。 この他に、PHPのライブラリ部分を高速化したPhalconというのも在るようですが、まだ、上記の性能競争のサイトに名前が上がるほどにはポピュラーにはなっていあにようです。 ・PHPとNode.jsの性能比較で、決定的に違うのは、同時期の最大接続数でしょう。 PHPは、クライアント・ブラウザ側との接続にOSのスレッドを1対1で消費しているので、OSのSocketのopen可能な上限値を越える同時接続が出来ません。 それは、1千接続か、少々OSをチューニングしても4千接続程度です。 一方、Node.JsやJava言語では、webSocketと言って、C10n(1万を超える同時接続)が可能な、通信プロトコルをサポートしています。 サーバから観ると、チャットのように、ユックリ、マバラにアクセスするのに、何時までもつながり続けているのが、open中のsocketを占有されることになり、実現困難なのです。 でも、Node.Jsには、1個のHTTPプロトコル通信用のsocketを、複数人で分割共用できるようなテクニックが実現されたwebSocketをサポートしているので、1万人を超えてつなぐことができるチャットが簡単に記述できるのです。 例えば、下記URLを開いて”Run”ボタンを押すと、マルチプレイヤでお絵かきチャットができるURLが活性化します。 http://runnable.com/U1IxKJmPnE87np8c/canvas-of-multiplayer-with-nod... 上記URLでのJavaScriptの記述量は200行程度ですが、それだけで、1万人程度まで同時期に、同じcanvasに気ままに線を描ける(他の999人の描画内容がブロードキャストされる)らしいです。 でも、PHPや、PHPの前段に繋ぐApatch httpサーバは、そんなに沢山の人にブロードキャストできるほど、connectできません。 ・バックエンド・サーバの性能の確保し易さ PHPのバックエンドとして接続可能なのは、MySQL等のSQL型DBサーバ位でしょう。 そのSQLサーバ上で動作するストアドプロシジャの構文は、PHPとは全く異なるモノで、使うのも面倒でしょう。 でも、javaScriptだと、Redisなどの、ストアドプロシジャの構文もJavaScriptで、非同期処理を行ってくれるバックエンドサーバがあります。 Node.jsでも、SQLサーバを単にデータの格納庫として使うこともできますが、さらに長時間走行するバッチ的な処理を非同期で実行させると、フロントエンド・ブラウザには速やかに応答を返すことができて、”エンドユーザ”にとって快適なサーバとすることができるでしょう。 http://vitalify.jp/blog/2012/10/websocket%E3%81%A7%E3%83%81%E3%83%A... 「WebSocketでチャットアプリを作る with Redis&Node.js」 -- ツイデに、拙作 知恵袋の紹介。 このURLの下のほうに、Node.jsと その他のミドルウェアとを組み合わせた事例等へのリンク集を掲載しています。