このイベントは、オープンソースコミュニティとやり取りするのに十分な時間とエネルギーがないために数回延期されましたが、やがて大切な日が訪れ、プロジェクト内で使用されるKPHPおよびその他のツールのコードが公開されました。
この点に関して、VKontakteの内部構造と、現在オープンソースコミュニティで利用できるツールについての詳細なストーリーがあります。

ソースコードは、GNUライセンス(GPLおよびLGPL)の下でレイアウトされました。 これらのライセンスは、イデオロギー的に私たちに近いものです。これらのライブラリを作成するときに、GNUによって特別にライセンスされたツールをよく使用したからです。
Kphp
VKontakteのソースコードは、KittenPHPまたはKPHPと呼ばれるPHPに似た言語で開発されています。 このコードは、同じ名前の特別なトランスレーターによってC ++に変換されます。 その後、生成されたC ++コードはgccで自動的にコンパイルされ、実行可能なバイナリが作成されます。 このバイナリは、http要求を受け入れてページを生成するWebサーバーです。開発プロセスを高速化するために、KPHPはさまざまなプロジェクトファイルを個別にコンパイルしてからリンクします。 後続のコンパイルでは、変更されたファイルのみが処理され、大きなファイルの場合はその一部のみが処理されます。
KPHPは、開発の利便性と速度を犠牲にすることなく、非常に高速な作業を提供するために設計された最小限の言語です。 この点で、KPHPはPHPのすべての機能をサポートしていません。特に、標準ライブラリの一部のオブジェクトを除き、OOPはありません。 さらに、「e」修飾子付きの正規表現などのevalおよび関連するものはサポートされていません(代わりに、preg_replace_callback関数が推奨されます)。 また、配列の特定の要素を最初、最後、次、前、現在、リセット、キーで操作するための関数。 それらを置き換えるために、getValueByPosおよびgetKeyByPos関数が実装されています。
大量の機能のサポートを拒否したため、KPHPはWeb開発用の他のツールと比較して非常に高速になりました。
例として、Facebookで開発されたHipHop VMと比較し、次の結果を得ました。
テスト | Kphp | Hhvm | Php |
シンプルな | 0.000 | 0.007 | 0.137 |
シンプルコール | 0.000 | 0.004 | 0.174 |
シンプルコール | 0.007 | 0.008 | 0.178 |
シンプル | 0.007 | 0.009 | 0.181 |
マンデル | 0.010 | 0.066 | 0.392 |
マンデル2 | 0.011 | 0.074 | 0.355 |
アッカーマン(7) | 0.001 | 0.011 | 0.189 |
ary(50,000) | 0.003 | 0.008 | 0.024 |
ary2(50,000) | 0.003 | 0.010 | 0.022 |
ary3(2000) | 0.011 | 0.077 | 0.191 |
フィボ(30) | 0.003 | 0.019 | 0.481 |
ハッシュ1(50,000) | 0.018 | 0.034 | 0.044 |
ハッシュ2(500) | 0.011 | 0.021 | 0.039 |
ヒープソート(20,000) | 0.012 | 0.040 | 0.101 |
マトリックス(20) | 0.007 | 0.021 | 0.121 |
ネストループ(12) | 0.000 | 0.012 | 0.235 |
ふるい(30) | 0.013 | 0.016 | 0.114 |
strcat(200000) | 0.002 | 0.005 | 0.014 |
結果 | 0.119 | 0.442 | 2.992 |

テストコードは次の場所にあります。
gist.github.com/anonymous/9391146#file-bench-php
開発の観点から見ると、KPHPはPHPと十分な互換性があるため、通常のPHPを使用して記述されたコードをすばやくテストし、最終テストとプロジェクトのロールアウトの前にのみコードをコンパイルできます。 KPHPで実装されているが、通常のPHPでは使用できない機能をサポートするために、PHPの機能を拡張する特別なライブラリgithub.com/vk-com/kphp-kdb/tree/master/vkextが追加されました。
さらに、KittenPHPは、起こりうるエラーを指摘する優れた静的PHPコードアナライザーです。 たとえば、1年前にVKontakteをVKontakteに転送するプロセスで、20を超える重大なバグが見つかりました。
開発者は、オープンライセンスの下でコンパイラと一緒に、KPHPを完全に補完するが、それとは別に使用できるエンジンのセットをレイアウトしました。 初めて、これらのライブラリをHighload 2010でオープンソースコミュニティに発表したため、かなり長い待ち時間をおwaiting び申し上げます。
PMemcached(「永続的なMemcached」)
時間制限なしでデータを保存できる信頼性の高いキーと値のストレージ。 MCプロトコルによれば、エンジンはMemcacheと同じように機能しますが、リブート後はすべてのデータが残ります。基本機能に加えて、構成で対応するオプションを有効にすると、pmemcachedを使用すると、要求で指定されたキープレフィックスと一致するレコードのグループをすぐに受信できます。
リスト
このエンジンを使用すると、さまざまなデータリストを保存および取得できます。エンジンの1つのコピーに一連のリストを保存できます。 各リストには、このリストを操作するための識別子(int)が必要です。
各リストには、無制限の数のアイテムを含めることができます。 各要素には、識別子(int)、値(int)、フラグ(int)も必要であり、任意の256文字のテキストを格納できます。
リストの受信に加えて、フラグによるフィルタリングと値によるソートにより、サブリストを受信することができます。
ドキュメント: github.com/vk-com/kphp-kdb/blob/master/docs/en/KittenDB_Lists.wiki
Lists-x
リストエンジンの変更。1つの数字(int)ではなく、エンジン構成で事前定義された数字の数(int)で構成されるレコードのキーと識別子を使用できます。 たとえば、これによりリストを作成できます。リストのキーは、壁にあるユーザーIDとレコーディングIDから形成されます。ドキュメント: github.com/vk-com/kphp-kdb/blob/master/docs/en/KittenDB_Lists-X.wiki
検索する
サイト上のデータを検索するように設計されています。 任意のテキスト情報は、特定の識別子を使用してエンジンでインデックス付けされ、その後テキスト内の単語によって検出されます。 インデックス作成中に指定された識別子は、検索結果に返されます。検索では、基準による検索用の任意のパラメーターと、さまざまな並べ替え用の特別なパラメーターをサポートしています。 このエンジンでは、複雑なグループ化と交差も可能です。
ドキュメント: github.com/vk-com/kphp-kdb/blob/master/docs/en/KittenDB_Search.wiki
保管
このエンジンは、写真、ビデオ、音声、ドキュメントなどのユーザーデータを保存するように設計されています。 単一のファイルに異なるコンテンツを保存し、メモリオフセットにインデックスを作成することにより、ストレージは、ファイルシステムに個々のファイルを保存する従来のアプローチを使用するよりも優れています。ドキュメント: github.com/vk-com/kphp-kdb/blob/master/docs/en/KittenDB_Storage.wiki
テキスト
テキストエンジンを使用すると、さまざまなテキストデータ配列を格納できます。 当初、VKのパーソナルメッセージングシステム用に開発されましたが、後に壁やコメントに再利用されました。テキストの保存に加えて、エンジンはテキストとテキスト検索を含むリストのさまざまなグループ化をサポートします。 彼のおかげで、どんなに大きくても、ユーザーの個人的な通信全体でインスタント検索を利用できます。
また、このエンジンにはHTTPサーバーが組み込まれており、クライアント側から更新を受信するための長いポーリングを実装しています。 ただし、この目的のために後で別のキューエンジンが作成されました。これについては以下で説明します。
ドキュメント: github.com/vk-com/kphp-kdb/blob/master/docs/en/KittenDB_Texts.wiki
ヒント
ヒントは、2つの重要なタスクを解決します。1)単語のプレフィックスでユーザーオブジェクトを検索するように設計されており、サイトでのクイック検索に使用されます。
2)オブジェクトの評価を生成できます。これにより、ユーザーに対するオブジェクトの関心度でオブジェクトのリストをソートできます。 たとえば、VKontakteのフレンドリストはこのように機能します。
ドキュメント: github.com/vk-com/kphp-kdb/blob/master/docs/en/KittenDB_Hints.wiki
キュー
キューを使用すると、クライアント側とサーバー側の間の通信をリアルタイムで整理できます。 クライアントは、割り当てられたキューサーバーに接続し、そこから更新を受信します。サーバーは、対応するイベントをいつでもクライアントに送信できます。 クライアントがキューに接続するときにサブスクライブできるチャネルを使用するため、エンジンを使用してデータを1対多に転送できます。たとえば、ユーザーがニュースページを開いている場合、彼はすべての友人、グループ、およびサブスクリプションのイベントのキューにサブスクライブします。 このリストから誰かがレコードを公開すると、彼はそれを対応するキューサブスクリプションにも書き込みます。各サブスクライブユーザーはクライアントでこれに関する情報を受信し、その後クライアントは受信したデータを表示できます。ドキュメント: github.com/vk-com/kphp-kdb/blob/master/docs/en/KittenDB_Queue.wiki
上記に加えて、リポジトリには、それほど一般的ではないが、それほど興味深いツールではない、他の多くのドキュメントを見つけることができます 。
おわりに
これらの開発を公開することで、私たちはオープンソースコミュニティに負債を返済しています。MySQL、Memcache、nginx、PHPがやがてVKontakteの作成を支援したため、現在開発中のプロジェクトを支援してくれることを願っています。
エンジンとKPHPのソースコードは、githubのリポジトリで確認できます: github.com/vk-com/kphp-kdb
詳細なドキュメントは、 github.com / vk-com / kphp-kdb / tree / master / docs / ruにあります。