Qbix Server、純PHPでfpmの14倍のスループットを実現
I built the fastest PHP webserver in the world

Qbix Serverは、拡張機能やDockerを使わず純粋なPHPだけで動作するWebサーバー。親プロセスにフレームワークを読み込んでからpcntl_fork()でワーカーを生成し、Copy-on-Writeで1ワーカーあたり120KBに抑える。未修正のWordPressやLaravelがそのまま動き、I/Oバウンドでphp-fpmの14倍、CPUバウンドで6.6倍の性能を発揮。WebSocketやSQLiteレプリケーションも統合し、1台で4万同時接続をさばく。
ブロッキングI/Oは、十分な数のワーカーがあれば問題にならない。
HNでの議論
48- confusedbucket
preforkモード(FPM/Apache modとすら競合できない)を除けば、これはどこにも言及されていない分離の問題を山ほど抱えている。具体的には、関数内のstatic(PHPではリクエストライフタイムのキャッシュとしてよく使われる)、デフォルト値のない型付きstatic、define()、$_ENV、setlocale()、ignore_user_abort()、mb_internal_encoding()など、ほんの一部を挙げただけでもこれだけある。また、すべての関数/クラス宣言がガードされていることを前提としているので、これは「そのまま動く」ウェブサーバーのドロップイン代替品ではない。ほとんどのコードではおそらく動かないので、「無修正のPHP」という主張は無理があるように思える。
編集:かなり長いREADMEを読んだところ、この点には言及があった。つまり、高速化するには提供されているサーバーAPIを使うか、CGIモードを使うかだ。WP、Laravel、Symfony(「レガシー」だと、本当に?)でさえそうだ。約束された結果を実際に達成する唯一の方法がそれであるなら、フレームワークとして宣伝した方がいいだろう。
ウェブサーバーのコード自体にも少し戸惑っている。PHP 5のコード(@classや@privateアノテーションまで付いている)で、8.1(EOL)をターゲットにしており、PHP 8.2では非推奨の警告が出る。
取られているアプローチは興味深いが、これを重要なものの前に置く気にはならない。
ウェブサーバーを動かさなければならないことにこれほど抵抗があるのに、バイブコーディングされたウェブサーバーには抵抗がないなら、Goや.NETなど、PHP固有の共有なしモデルと戦わなくて済むスタックに切り替えることを検討してはどうか。
- pshirshov
> 1060 req/s
いいね!2010年、シングルコアのPentium 4がGlassfishで18k RPSを余裕で出していたのを覚えているよ。さらに10年の進歩で、それに追いつけるんだな!
- christophilus
ちょっと話が逸れるけど、最近Odinを学ぶためにOdinでHTTPサーバーを書いた。快適な言語で、うまく管理すればメモリ使用量も非常に少ない。古いラップトップで毎秒約5万リクエストだった。驚いたのは、Bunがそれに匹敵したことだ(ただしメモリ使用量はOdinの3MBに対して50MBだった)。
こういうものをいじるのはとても楽しいけど、現実にはほとんどのアプリにとって、ほぼどんなスタックでも十分すぎるほどだ。
- nzeid
> php-fpmはリクエストごとにフレームワークを再ブートストラップする(10〜50ms)
これを確認するために使ったセットアップ/ベンチマークは何ですか?
- dreadnip
人々は90年代からpcntl_forkを使ってPHPコードを高速化してきた。紙の上では良さそうに見え、"印象的な"デモを生み出せるが、実際のプロジェクトやユースケースではすぐに崩壊する。これはLLMのスロップ/精神病に過ぎない。