FacebookがPHPのほかにC++を使用する必要がある主な理由は何ですか?多くの訪問者がいるWebサイトを作成する場合、C++も使用する必要があるのでしょうか。
理由は次のとおりです: PHPのHipHop:高速に移動 :
Facebookの重要な価値の1つは、迅速に行動することです。過去6年間、PHPが提供する急速な開発ペースのおかげで、多くのことを達成することができました。プログラミング言語として、PHPはシンプルです。学ぶこと、書くこと、読むこと、そしてデバッグすることのそれぞれが簡単です。PHPを使用すると、他の言語よりも速く、Facebookで新しいエンジニアを増やすことができます。これにより、イノベーションを加速させます。
今日、私はこのプロジェクトをすばらしい人々の小さなチームと共有できることを嬉しく思っており、過去2年間取り組んできました。 PHPのHipHop。 HipHopを使用すると、ページによっては、WebサーバーのCPU使用率を平均で約50%削減できました。 CPUが少ないほどサーバーが少なくなり、オーバーヘッドが少なくなります。このプロジェクトはFacebookに多大な影響を与えました。私たちはWeb全体でHipHopの恩恵を受けることができると考えているので、PHPを使用して大規模で複雑なWebサイトのスケーリングに新たな焦点をもたらすことを期待して、今晩オープンソースとしてリリースします。 HipHopは驚くべき結果を示していますが、それは確かに完全ではなく、試してみる前にベータ版ソフトウェアに慣れる必要があります。
PHPのHipHopは、技術的にはコンパイラ自体ではありません。むしろ、それはソースコードトランスフォーマーです。HipHopは、プログラムでPHPソースコードを高度に最適化されたC++に変換し、次にg ++を使用してコンパイルします。HipHopは、意味的に同等の方法でソースコードを実行し、パフォーマンスの向上と引き換えに、eval()などのほとんど使用されない機能を犠牲にします。HipHopには、コードトランスフォーマー、PHPのランタイムシステムの再実装、および多くの一般的なPHP拡張機能の書き換え。これらのパフォーマンス最適化を利用します。
スケーリングPHP
PHPのルーツは、Perl、Python、Rubyなどのスクリプト言語のルーツです。これらはすべて、プログラマーの生産性と製品で迅速に反復する機能の点で大きな利点があります。これは、C++のようなより伝統的なコンパイル言語やJavaのようなインタプリタ言語と比較されます。一方、スクリプト言語は一般に、CPUとメモリの使用に関して効率が悪いことが知られています。このため、Facebookを毎月4,000億を超えるPHPベースのページビューにスケーリングすることは困難です。
これらの非効率性に対処する一般的な方法の1つは、PHPアプリケーションをC++で直接PHP Extensionsとして書き換えることです。これにより、主にPHPフロントエンドHTMLとC++のアプリケーションロジックの間のグルー言語に変換します。技術的な観点からはこれはうまく機能しますが、アプリケーション全体で作業できるエンジニアの数を大幅に減らします。C++の学習はPHP Extensionsを書く最初のステップは、2番目はZend APIを理解することです。エンジニアリングチームは比較的小さいため、エンジニアごとに100万人以上のユーザーがいるため、コードベースの一部を他よりもアクセスしにくくします。
ほとんどすべてのページビューがカスタマイズされたエクスペリエンスを持つログインユーザーであるため、Facebookのスケーリングは特に困難です。ホームページを表示するときは、すべての友達を検索し、最も関連性の高い更新(マルチフィードと呼ばれるカスタムサービスから取得)をクエリし、プライバシー設定に基づいて結果をフィルター処理して、ストーリーにコメントを入力する必要があります、写真、いいね!、そして人々がFacebookについて愛するすべての豊富なデータ。このすべてが1秒足らずで完了します。 HipHopを使用すると、最終ページのアセンブリを実行するロジックをPHPで記述し、C++、Erlang、Java、またはPythonサイトのニュースフィード、検索、チャット、およびその他の中核部分にサービスを提供します。
2007年以降、私たちはこれらの問題を解決するためのいくつかの異なる方法を考え、それらのいくつかを実装することさえ試みてきました。一般的な提案は、Facebookを別の言語で書き直すことですが、サイトの開発の複雑さと速度を考えると、これを達成するにはしばらく時間がかかります。 Zend Engineの側面(PHPの内部)を書き直し、これらのパッチをPHPプロジェクトに戻しましたが、最終的には必要なパフォーマンスの向上は見られませんでした。HipHopの利点は私たちの開発スピードにほとんど透明です。
HipHopのハッキング
数年前のハッカソンでのある夜(プライムタイムハックを参照)、最初のコードの変換を開始しましたPHP C++に変換します。言語は構文的にかなり類似しており、C++は大幅に優れていますPHP CPUとメモリの両方に関して言えば。PHP自体もCで書かれています。このサイズのコードベース全体を正常に書き直すことは不可能であることがわかっていました。しかし、プログラムでそれを実行するシステムを構築するとどうなるのか疑問に思いました。
PHP=パフォーマンスを向上させる新しい方法を見つけることは新しい概念ではありません。実行時にZend EngineはPHPソースをopcodeに変換し、それを次に実行しますZend VirtualMachine。APCやeAcceleratorなどのオープンソースプロジェクトはこの出力をキャッシュし、PHPを使用しているWebサイトの大部分で使用されています。ZendServerもあり、PHPオペコードの最適化とキャッシングにより高速化。代わりに、PHPソースをC++に直接変換し、ネイティブマシンコードに変換できるようにしました。コンパイルもPHPは新しいアイデアではありません。RoadsendやphcなどのオープンソースプロジェクトはPHP to Cに、QuercusはPHP to Javaに、そしてPhalangerをコンパイルします。 PHP to .Net。
言うまでもなく、その1つのハッカソンよりも時間がかかりました。 8か月後、コンパイルされたコードで実際に高速に実行できることを示すのに十分なコードがありました。プロジェクトのペースを速めるために、チームにIain ProctorとMinghui Yangをすばやく追加しました。次の10か月はすべてのコーディングを完了し、次の6か月は運用サーバーでテストしました。この時点で、展開後わずか6か月で、HipHopを使用してWebトラフィックの90%以上にサービスを提供していることを誇りに思います。
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)の最良の側面を維持できます。合計で、30万行を超えるコードと5,000を超えるユニットテストを記述しています。
短い答え-いいえ、必要ありませんC++は必要ありません。
HipHop のことだと思います。それが提供する改善について読むと、それは約50%です。何千ものフロントエンドサーバーがあるFacebookの場合、これは非常に重要です。それらの負荷を削減することは、データセンターの数百万ドルのコスト削減を意味します。 10〜100台のフロントエンドサーバーを備えている企業の場合、開発コストは可能な節約をはるかに上回ります。とにかく、最も重い処理はバックエンドで行われます。これは通常、高度に最適化されたC/C++コードとして開発されたRDBMSまたはNoSQLソリューションです。
もちろん、PHP=を完全にダンプするだけで、はるかに高い節約を達成できたかもしれません。しかし、Facebookの場合のように、それは巨大なコードベースで実行できるものではありません。
さて、質問の他の部分について:あなたが本当に巨大な負荷に対処する方法を知りたいのであれば、- High Scalability blog 、特にReal Life Architecturesの部分を読んでください。
PHPでそれは可能ですが、間違いなく私の選択ではありません。動的言語Pythonが必要な場合は、Rubyまたは多分Luaの方がはるかに良い選択でしょう。
FBのアプローチの良い点は、彼らがすぐに決める必要がなかったことです。同じことをする必要があります。最も生産性の高い言語を選択しますが、C/C++と簡単にやり取りできるようにしてください。
何百万人ものユーザーがいて、応答時間を数ミリ秒短縮する必要がある場合は、C/C++を使用してクリティカルパスを最適化できます。
Facebookが使用するC++要素はHHVMです。
それがHIPHOP仮想マシンです。 C++で書かれていますが、本質的には「より良いPHPインタプリタ」です。
Phpコードはバイトコードにコンパイルされ、実行時にHHVMによって解釈され、実行時に「ジャストインタイム」最適化の対象になります。
Facebookの開発者は今でも主にPHPで作成しており、ブラウザーで表示されるものは、ほぼ確実にPHPプログラム-HBVMランタイムによってコンパイルおよび解釈されたものです)によって出力されます。 。
実際のHHVMは無料で入手できるオープンソースです。したがって、1時間に100万のかわいい子猫の写真を提供する必要がある場合は、HHVMをダウンロードして、PHPの変更を最小限に抑えてサーバーを高速化できます。