FacebookがPHPのほかにC ++を使用する必要がある主な理由は何ですか?多くのビジターでWebサイトを作成する場合、C ++も使用する必要がありますか?
FacebookがPHPのほかにC ++を使用する必要がある主な理由は何ですか?多くのビジターでWebサイトを作成する場合、C ++も使用する必要がありますか?
回答:
その理由は次のとおりです。PHP用HipHop:Move Fast:
Facebookでの重要な価値の1つは、速く動くことです。過去6年間、PHPが提供する急速な開発のおかげで、多くのことを達成することができました。プログラミング言語として、PHPは単純です。学びやすく、書きやすく、読みやすく、デバッグしやすい。Facebookでは、他の言語よりもPHPを使用して新しいエンジニアをより迅速に立ち上げることができます。
今日、私はこのプロジェクトをすばらしい人々の小さなチームで共有できることを楽しみにしており、過去2年間取り組んでいます。HipHop for PHP。HipHopを使用すると、ページによって異なりますが、WebサーバーのCPU使用率が平均で約50%削減されました。CPUが少ないとサーバーが少なくなり、オーバーヘッドが少なくなります。このプロジェクトはFacebookに多大な影響を与えました。私たちはWeb全体がHipHopの恩恵を受けることができると考えているため、PHPを使用して大規模で複雑なWebサイトをスケーリングすることに新たな焦点をもたらすことを期待して、今夜オープンソースとしてリリースします。HipHopは驚くべき結果を示しましたが、それは確かに完全ではなく、試してみる前にベータ版ソフトウェアに慣れている必要があります。
HipHop for PHPは、厳密にはコンパイラそのものではありません。むしろ、ソースコードトランスフォーマーです。HipHopは、プログラムでPHPソースコードを高度に最適化されたC ++に変換し、g ++を使用してコンパイルします。HipHopは、意味的に同等の方法でソースコードを実行し、パフォーマンスの向上と引き換えに、eval()などのほとんど使用されない機能を犠牲にします。HipHopには、コードトランスフォーマー、PHPランタイムシステムの再実装、およびこれらのパフォーマンス最適化を活用するための多くの一般的なPHP拡張機能の書き換えが含まれています。
スクリプト言語としてのPHPのスケーリング
PHPのルーツは、Perl、Python、Rubyなどのスクリプト言語のルーツです。これらはすべて、プログラマの生産性と製品をすばやく反復する能力の点で大きな利点があります。これは、C ++などの従来のコンパイル言語やJavaなどのインタープリター言語と比較されます。一方、スクリプト言語は、一般的にCPUとメモリの使用に関して効率が悪いことが知られています。このため、Facebookを毎月4,000億を超えるPHPベースのページビューに拡大することは困難です。
これらの非効率性に対処する1つの一般的な方法は、PHPアプリケーションのより複雑な部分をPHP拡張機能としてC ++で直接書き換えることです。これにより、PHPがフロントエンドHTMLとC ++のアプリケーションロジックの間のグルー言語に大きく変わります。技術的な観点からは、これはうまく機能しますが、アプリケーション全体で作業できるエンジニアの数を大幅に減らします。C ++の学習は、PHP拡張機能を記述するための最初のステップにすぎず、2番目はZend APIを理解することです。エンジニアリングチームが比較的小さく、すべてのエンジニアに100万人以上のユーザーがいることを考えると、コードベースの一部を他の人よりもアクセスしにくくする余裕はありません。
Facebookのスケーリングは、ほとんどすべてのページビューがカスタマイズされたエクスペリエンスを持つログインユーザーであるため、特に困難です。ホームページを表示するときは、すべての友達を検索し、最も関連性の高い更新(Multifeedというカスタムサービスから)を照会し、プライバシー設定に基づいて結果をフィルターし、コメントをストーリーに入力する必要があります、写真、いいね、そしてFacebookについて人々が愛するすべての豊富なデータ。これらはすべて1秒以内に完了します。HipHopを使用すると、PHPで最終ページアセンブリを実行するロジックを記述し、C ++、Erlang、Java、またはPythonのカスタムバックエンドサービスに依存してニュースフィード、検索、チャット、およびその他のコアパーツを処理しながら、迅速に反復できますサイトの。
2007年以来、これらの問題を解決するためのいくつかの異なる方法を検討し、それらのいくつかを実装することさえ試みました。一般的な提案は、Facebookを別の言語で書き直すことですが、サイトの開発の複雑さと速度を考えると、これを達成するには時間がかかります。Zend Engineの側面(PHPの内部)を書き直し、それらのパッチをPHPプロジェクトに戻しましたが、最終的には必要なパフォーマンスの向上は見られませんでした。HipHopの利点は、開発速度に対してほとんど透過的です。
HipHopのハッキング
ある夜、数年前のハッカソンで(Prime Time Hackを参照)、PHPをC ++に変換する最初のコードを始めました。言語は構文的にはかなり似ており、C ++はCPUとメモリの両方の使用に関してPHPを大幅に上回ります。PHP自体もCで書かれています。このサイズのコードベース全体を手作業で書き換えることは不可能であることはわかっていましたが、プログラムでそれを行うシステムを構築するとどうなるのかと思いました。
PHPのパフォーマンスを改善する新しい方法を見つけることは、新しい概念ではありません。実行時に、Zend EngineはPHPソースをオペコードに変換し、その後オペコードはZend Virtual Machineを介して実行されます。APCやeAcceleratorなどのオープンソースプロジェクトはこの出力をキャッシュし、PHPを使用するWebサイトの大半で使用されます。Zend Serverもあります。これは、オペコードの最適化とキャッシングによりPHPを高速化する商用製品です。代わりに、PHPソースをC ++に直接変換し、ネイティブマシンコードに変換することを考えていました。PHPのコンパイルも新しいアイデアではありません。RoadsendやphcなどのオープンソースプロジェクトはPHPをCにコンパイルし、QuercusはPHPをJavaにコンパイルし、PhalangerはPHPを.Netにコンパイルします。
言うまでもなく、その単一のハッカソンよりも時間がかかりました。8か月後、コンパイルされたコードで実際に高速に実行できることを示すのに十分なコードがありました。Iain ProctorとMinghui Yangをチームにすばやく追加して、プロジェクトのペースをスピードアップしました。次の10か月はすべてのコーディングを仕上げ、6か月は実稼働サーバーでのテストに費やしました。この時点で、Webトラフィックの90%以上がHipHopを使用してサービスを提供していることを誇りに思っています。これはすべて、展開後わずか6か月です。
HipHopの仕組み
プロジェクトの主な課題は、PHPとC ++のギャップを埋めることでした。PHPは、動的で弱い型付けのスクリプト言語です。C ++は、静的型付けを備えたコンパイル済み言語です。PHPでは魔法の動的機能を作成できますが、ほとんどのPHPは比較的簡単です。見ている
if (...) {...} else {..}
よりも 見ている可能性が高いですfunction foo($x) { include $x; }
。ここでパフォーマンスが向上します。可能な限り、生成されたコードは関数と変数に静的バインディングを使用します。また、型推論を使用して、変数に可能な限り具体的な型を選択し、メモリを節約します。変換プロセスには、3つの主要なステップが含まれます。
- 誰が何を宣言し、依存関係に関する情報を収集する静的分析、
- C ++スカラー、文字列、配列、クラス、オブジェクト、バリアントの中で最も具体的なタイプを選択するタイプ推論、および
- ほとんどの場合、PHPステートメントと式からC ++ステートメントと式に直接対応するコード生成。
また、開発用に設計された実験的なインタープリターであるHPHPiも開発しました。HPHPiを使用する場合、実行する前にPHPソースコードをコンパイルする必要はありません。HipHop自体のバグを見つけるのに役立ち、エンジニアがPHPの記述方法を変更せずにHipHopを使用する方法を提供します。
全体的にHipHopを使用すると、C ++のパフォーマンス上の利点を活用しながら、PHPの最良の側面を維持できます。合計で、300,000行を超えるコードと5,000を超えるユニットテストを記述しました。
簡単な答え-いいえ、C ++ は必要ありません。
あなたはHipHopに言及していると思います。それが与える改善について読んだ場合、それは約50%です。これは、数千のフロントエンドサーバーがあるFacebookの場合に非常に重要です。それらの負荷を削減することは、数百万のデータセンターのコスト削減を意味します。10〜100台のフロントエンドサーバーを所有している企業の場合、開発コストは大幅に節約できる可能性があります。とにかく、最も重い処理はバックエンドで行われます。これは通常、高度に最適化されたC / C ++コードとして開発されたRDBMSまたはNoSQLソリューションです。
もちろん、PHPを完全にダンプするだけで、はるかに高い節約を達成できます。しかし、Facebookの場合のように、それは巨大なコードベースでできることではありません。
さて、質問の他の部分について:巨大な負荷に対処する方法を本当に知りたい場合は、High Scalabilityブログ、特にReal Life Architecturesの部分を読んでください。
PHPでも可能ですが、間違いなく私の選択ではありません。動的言語が必要な場合は、Python、Ruby、またはLuaの方がはるかに良い選択です。
Facebookで使用されるC ++要素はHHVMです。
それがHIPHOP仮想マシンです。C ++で書かれていますが、本質的には「より良いPHPインタープリター」です。
phpコードはバイトコードにコンパイルされ、実行時にHHVMによって解釈され、実行時に「Just In Time」最適化の対象となります。
フェイスブックの開発者は、まだほとんどがPHPで記述されており、ブラウザで表示されるものは、ほぼ間違いなくPHPプログラムによって出力されます。
実際のHHVMは、自由に利用できるオープンソースです。したがって、1時間に100万匹のかわいい子猫の写真を提供する必要がある場合は、HHVMをダウンロードして、PHPの変更を最小限に抑えてサーバーを高速化できます。