Polling APIはPHPにおいて最も過小評価されているアップデートである
PHP 8.6には、高並列ネットワーク通信のすべてを変えてしまうような、静かなアップデートが含まれています。
多くの開発者がジェネリクスについて議論している間、Polling APIはほとんど騒がれることなくRFCを通過しました。これは、FrankenPHPの作成者やComposerの作者といった主要な人物からも支持を得ています。
長年、PHPはstream_select()に依存してきました。このツールは1983年のシステムコールを使用しています。これには3つの大きな欠点があります。
- ほとんどのシステムでファイル記述子の制限が1024に達する。
- O(n)の計算量を使用するため、接続数が増えるにつれてパフォーマンスが低下する。
- LinuxのepollやmacOSのkqueueといったモダンなツールへのアクセスができない。
これが、AMPHPやReactPHPのような非同期ライブラリが、高いパフォーマンスを発揮するためにext-uvのような追加の拡張機能を必要としてきた理由です。PHPには、大規模なネットワーク通信のためのネイティブな基盤が欠けていました。
Polling APIはこの欠落を解消します。
これによりIo\Poll名前空間が導入されます。このAPIは、システムに最適なバックエンドを自動的に選択します。Linuxではepoll、macOSではkqueue、Solarisではevent portsを使用します。これらの詳細を管理する必要はありません。
実践的な仕組みは以下の通りです。
- Contextを作成する。
- ストリームをStreamPollHandleでラップする。
- 監視したいイベントとともに、それをcontextに追加する。
- wait()を呼び出し、実際に発生したトリガーのみを受け取る。
これは完全なイベントループではありません。低レベルのプリミティブです。イベントループをより高速かつ確実に動作させるための「配管(plumbing)」を提供するものです。
真の魔法は内部にあります。このAPIにより、PHPコアと拡張機能が統一されたインターフェースを共有できるようになります。これにより、以下が可能になります。
- FrankenPHPのための効率的なシグナルハンドリング。
- PHP-FPMワーカーにおけるより優れたイベントハンドリング。
- ソケットとcurlのための標準化されたインターフェース。
- 高パフォーマンスなエッジトリガーモード。
PHPはスケールできないとしばしば言われます。長い間、その主張には技術的な理由がありました。PHPには、NginxやGoで使用されているポーリング・プリミティブへのネイティブなアクセスがなかったのです。
PHP 8.6によって、その言い訳はなくなりました。
最良のインフラストラクチャの変化は、しばしば目に見えないものです。epollに気づくことはありません。ただ、サーバーが何事もなかったかのように1万件の接続を処理していることに気づくだけです。
Polling APIは、エコシステム全体の天井を引き上げる、地味ながらも重要な仕事なのです。
出典: https://dev.to/juststevemcd/the-polling-api-is-the-most-underrated-rfc-php-has-shipped-in-years-2d32
