プログラミング
世界最速のPHPウェブサーバーを構築した
I built the fastest PHP webserver in the world (qbixserver.com)
要約
開発者は、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で表示 →
バイナリをダウンロードする
例