HN 日本語サマリー

← 一覧へ戻る
プログラミング

世界最速のPHPウェブサーバーを構築した

I built the fastest PHP webserver in the world (qbixserver.com)

23 pointsby EGreg16 コメント

要約

開発者は、Swoole、FrankenPHP、RoadRunnerといった既存のソリューションよりも高速であると主張する、純粋なPHPで書かれた新しいウェブサーバー「Qbix」を発表しました。このサーバーは、PHPのコードを一切変更せず、追加の拡張機能やDockerも不要で、単一のファイルまたはバイナリとして動作します。大量のワーカープロセスを効率的に管理するCopy-on-Write(COW)メモリ共有技術により、低メモリフットプリントで高いスループットを実現します。

全文翻訳

純粋なPHP製のウェブサーバー。未加工のコードでSwoole、FrankenPHP、RoadRunnerよりも高速。拡張機能、アダプター、Dockerは不要。1つのファイル。 git clone https://github.com/Qbix/webserver cd webserver php qbixserver.php または、自己完結型のバイナリを入手する curl -LO https://github.com/Qbix/webserver/releases/latest/download/qbixserver-linux-x86_64 chmod +x qbixserver-linux-x86_64 ./qbixserver-linux-x86_64 GitHubで表示 例を見る すべてを1つのプロセスで nginx + fpm + Node + Redis + supervisor + Dockerを置き換えます。 ⚡14倍のスループット 各ワーカーは120KBで永続化。200MBで400ワーカー。fpmが78を処理する場所で1,060 req/s。 詳細はこちら → 🔌WebSocket + Rooms HTTPと同じポート。Roomsは共有状態を持つフォークされたプロセスです。Socket.IOプロトコル。Nodeは不要。 詳細はこちら → 🧩未加工のPHP WordPress、Laravel、Symfony、Drupal。28の関数をシム化。.htaccessを読み取ります。ただ動作します。 詳細はこちら → 🔒マイクロサービス分離 設定変更1つで、権限とサンドボックス化。同じコード、異なる役割。シークレットは権限から漏れません。 詳細はこちら → 🌐クラスターレプリケーション SQLiteを使用した複数のサーバー。イベントはレプリケートされます。ノードを停止し、再起動すると、キャッチアップします。 詳細はこちら → 📦6つのサンプルアプリ チャット、カンバン、SSEストリーム、REST API、ライブカウンター、分散スウォーム。すべて含まれています。 詳細はこちら → 📋スマートレスポンスヘッダー コンポーネントごとの無効化のためのX-Cache-Tree。アクセス制御されたファイルのためのX-Accel-Redirect。ETag生成。ディレクトリリスティング。 詳細はこちら → 📈自動生成APIドキュメント ハンドラーファイルを記述すると、OpenAPI 3.1およびMCP仕様が自動的に生成されます。Swagger UI、Postman、Redoc — そしてAIツールがアプリのAPIに直接呼び出し可能になります。 詳細はこちら → 🔐TLS、Cron、ロギング 証明書が存在する場合、HTTPSが自動的に開始されます。組み込みのcronスケジューラー。日次ローテーションとgzipアーカイブを備えたバッファリングされたアクセスログ。 詳細はこちら → 14倍 vs fpm (50ms I/O) 24倍 vs fpm (200ms I/O) 120KB ワーカーあたり (COW) 0.03ms 状態リセット 💡なぜ他のすべてよりも速いのか PHPコードの大部分 — WordPressプラグイン、Laravelパッケージ、すべてのPDO::query()およびfile_get_contents() — はブロッキングI/Oを使用します。Swooleのコルーチンは、yieldしないコードには役立ちません。FrankenPHPとRoadRunnerは、fpmと同じワーカー数制限モデルを使用します。Qbixは異なるアプローチを取ります:多数のワーカーを実行します。サーバーはフレームワーク全体を親プロセスにロードし、pcntl_fork()を呼び出してワーカーを作成します。カーネルは親のページをコピーオンライト(COW)としてマークします。ワーカーはロードされたすべてのクラスを共有します — 彼らは実際に書き込むページのみをリクエスト中に負担します。WordPressのようなリクエストは30ページを汚染します = Linuxでは120KB。したがって、200MBは4つのワーカー(fpmのような)ではなく、数千のワーカーを購入します。それぞれがデータベースクエリでブロックしますが、それは問題ありません。十分なワーカーがいれば、ブロッキングI/Oは重要ではありません。COWは、「十分なワーカー」が16GBではなく47MBで済む理由です。これは純粋なユーザーランドPHPです。カーネルモジュール、C拡張機能、カスタムアロケーターはありません。ロード後にpcntl_fork()を実行するだけで、OSが残りを処理します。私たちはこれをPHPコアにswitch_global_context()として提案しました。それがRFCプロセスを進む間、サーバーは今日ユーザーランドでそれを実行します。 🔍 Swoole、FrankenPHP、php-fpmとのベンチマーク CPUバウンド(WordPressライクなワークロード、同じ200MB): ワーカー数 req/s vs fpm php-fpm 4 ~350 — Swoole 4 ~400 1.1倍 Qbix 100 2,294 6.6倍 I/Oバウンド(50msデータベースクエリ): ワーカー数 req/s vs fpm php-fpm 4 78 — Swoole (コルーチン*) 4 ~300 ~4倍 Qbix 100 1,060 14倍 I/Oバウンド(200ms — 実際のデータベース負荷): ワーカー数 req/s vs fpm php-fpm 4 20 — Swoole (コルーチン*) 4 ~200–500 ~10–25倍 Qbix 200 488 24倍 * SwooleのコルーチンはRuntime::enableCoroutine()とコルーチン対応ドライバーが必要です。未加工のWordPress/LaravelはブロッキングI/Oを使用し、fpmの天井に達します。 🛡️ 28の関数がシム化 — 状態がリセットされる仕組み ワーカーは永続的です — 再起動せずに数千のリクエストを処理します。各リクエストの後、Reflectionベースのスナップショットが0.03msで全ての静的プロパティを復元します。28のPHP関数は、インクルード時にソース変換を介してインターセプトされます:header()、session_start()、register_shutdown_function()、ini_set()、set_error_handler()、set_exception_handler()、spl_autoload_register()、putenv()、その他20個 — これらはすべてリクエストごとに追跡され、リクエスト間にクリーンアップされます。未加工のWordPress、Laravel、Symfony、Drupalは、自動的に共有なしの安全性(shared-nothing safety)を得ます。アダプター不要、コード監査不要。完全な互換性の詳細はこちら → 📊 1台の月額30ドルのマシンで何人のユーザーを処理できますか? メトリック php-fpm Qbix 4GBでのワーカー数 ~80 (各50MB) 400 (各120KB) スループット (200ms I/O) ~80 req/s ~2,000 req/s 同時アクティブユーザー数 1,600 40,000 登録アカウント数 16K–32K 400K–800K WebSocket Node.jsが必要 100K+ 内蔵 データベース Postgresが必要 SQLite (50K writes/sec) 月額費用 $30 + DBサーバー 合計 $30 1台のマシン。データベースサーバー、Redis、Node、Dockerなし。冗長性のためにDNSフェイルオーバーを備えた2台目を追加 — 分散モードは両方のSQLiteコピーを同期させ続けます。 プリロード後のフォーク すべてを一度ロードします。ワーカーをフォークします。それぞれ120KB、42MBではありません。 親プロセス (30MB) フレームワーク · ルート · キャッシュ COW COW ワーカー (120KB) ワーカー (120KB) ワーカー (120KB) ワーカー (120KB) php-fpm: 4 × 42MB = 168MB Qbix: 400 × 120KB = 47MB 同じコード。同じRAM。100倍のワーカー。 ライブダッシュボード /Q/dashboard で組み込み。Grafana、Prometheus不要。 localhost:4000/Q/dashboard Qbix Server Dashboard 2,847 Req/min 142 Connections 400 Workers 23ms Latency 99.8% Uptime 47MB Memory 200 GET /api/users 12ms 200 POST /api/tasks 34ms 304 GET /css/app.css 1ms 200 WS /Q/ws upgrade 2ms ダッシュボードとコントロールパネルのドキュメント → 開始する git clone https://github.com/Qbix/webserver cd webserver php qbixserver.php --root=examples/todo/web GitHubで表示 → バイナリをダウンロードする 例