Workermanの特性
1、純PHP開発
Workermanで開発されたアプリケーションは、php-fpm、apache、nginxなどのコンテナに依存せずに独立して実行できます。これにより、PHP開発者はアプリケーションの開発、デプロイ、デバッグが非常に便利になります。
2、PHPのマルチプロセスをサポート
サーバーの複数CPUの性能を最大限に引き出すために、Workermanはデフォルトでマルチプロセス・マルチタスクをサポートしています。Workermanは1つのメインプロセスと複数の子プロセスを起動して外部にサービスを提供し、メインプロセスは子プロセスを監視し、子プロセスは独自にネットワーク接続をリッスンし、データの送受信および処理を行います。プロセスモデルがシンプルなため、Workermanはより安定しており、より効率的です。
3、TCPおよびUDPをサポート
WorkermanはTCPとUDPの2つのトランスポート層プロトコルをサポートしており、1つの属性を変更するだけでトランスポート層プロトコルを切り替えることができ、ビジネスコードに変更は必要ありません。
4、長接続をサポート
多くの場面でPHPアプリケーションがクライアントと長接続を保持する必要があります。例えば、チャットルームやゲームなどです。しかし、従来のPHPコンテナ(apache、nginx、php-fpm)ではこれを実現することが難しいです。Workermanを使用すれば、サーバー側のビジネスが接続を閉じるインターフェイスを積極的に呼ばない限り、PHPの長接続を使用できます。Workermanの単一プロセスは何万もの同時接続をサポートでき、多プロセスでは数十万甚至には百万の同時接続をサポートします。
5、さまざまなアプリケーション層プロトコルをサポート
Workermanのインターフェースはさまざまなアプリケーション層プロトコルをサポートしており、カスタムプロトコルも含まれています。Workermanではプロトコルの変更も非常に簡単で、単に1つのフィールドを設定するだけでプロトコルが自動的に切り替わり、ビジネスコードの変更はゼロで、さまざまなプロトコルのポートを開くこともでき、異なるクライアントのニーズに応えます。
6、高い同時接続をサポート
WorkermanはLibeventイベントポーリングライブラリをサポートしています(event拡張のインストールが必要)。長接続の高い同時接続時にはEventの使用により非常に優れたパフォーマンスを発揮します。Event拡張がインストールされていない場合は、PHPに組み込まれているSelect関連のシステムコールを使用し、パフォーマンスも非常に強力です。
7、サービスのスムーズな再起動をサポート
サービスを再起動する必要がある場合(例えば、バージョンのリリースなど)、ユーザーのリクエストを処理しているプロセスが即座に終了することは望ましくなく、再起動の瞬間にクライアント通信が失敗することも望ましくありません。Workermanはスムーズな再起動機能を提供しており、サービスのスムーズなアップグレードを保証し、クライアントの利用に影響を与えません。
8、ファイル更新検出と自動ロードをサポート
開発過程において、コードを変更した後に即座に反映されることを希望します。WorkermanはFileMonitorファイル監視コンポーネントを提供しており、ファイルに更新があれば、Workermanは自動的にreloadを実行し、新しいファイルを読み込んで反映させます。
9、指定ユーザーで子プロセスを実行することをサポート
子プロセスは実際にユーザーリクエストを処理するプロセスであり、安全面から考慮して子プロセスにはあまり高い権限を持たせないようにするため、Workermanは子プロセスを実行するユーザーを設定できることをサポートしており、サーバーの安全性を向上させています。
10、オブジェクトまたはリソースを永続的に保持することをサポート
Workermanは実行中にPHPファイルを1度だけ読み込んで解析した後、メモリに常駐させます。これにより、クラスや関数の宣言、PHP実行環境、シンボルテーブルなどは再作成や破棄されることはありません。この点は、Webコンテナで実行されるPHPメカニズムとは完全に異なります。Workermanでは、プロセスのライフサイクル内で静的メンバーやグローバル変数は、積極的に破棄されない限り永続的に保持されます。つまり、オブジェクトや接続などのリソースをグローバル変数またはクラスの静的メンバーに置いておけば、現在のプロセスの全ライフサイクル内でのすべてのリクエストで再利用できるということです。例えば、単一プロセス内でデータベース接続を1度初期化すれば、そのプロセスの以降のすべてのリクエストはこのデータベース接続を再利用でき、頻繁なデータベース接続の際のTCP三者間ハンドシェイク、データベース権限検証、接続が切れた際のTCP四者間ハンドシェイクの過程を回避し、アプリケーションの効率を大幅に向上させます。
11、高性能
PHPファイルはディスクから1度読み込まれて解析された後、メモリに常駐するため、次回使用する際にはメモリ内のopcodeを直接使用します。これにより、ディスクIOおよびPHP中のリクエスト初期化、実行環境の作成、字句解析、構文解析、opcodeのコンパイル、リクエストの終了などの多くの時間のかかるプロセスが大幅に減少します。また、nginx、apacheなどのコンテナに依存せず、nginxなどのコンテナとのPHP通信にかかるオーバーヘッドが減少し、最も重要な点はリソースが永続的に保持されるため、毎回データベース接続を初期化する必要がなくなります。このため、Workermanでアプリケーションを開発すると、非常に高いパフォーマンスが得られます。
12、HHVMをサポート
HHVM仮想マシン上で実行することがサポートされており、PHPの性能を倍増させることができます。特にCPU集中的な業務において、パフォーマンスは非常に優れています。実際の負荷テストの比較によると、負荷のない状況下で、WorkermanはHHVM上で実行するとZend PHP5.6上でのネットワークスループットが30%から80%向上することが確認されています。