workerman開発者が知っておくべきいくつかの問題
1、Windows環境の制約
Windowsシステムでは、workermanの単一プロセスは200以上の接続にしか対応していません。
Windowsシステムでは、countパラメータを使用して複数プロセスを設定することはできません。
Windowsシステムでは、status、stop、reload、restartなどのコマンドを使用することはできません。
Windowsシステムでは、デーモンプロセスを使用することができず、cmdウィンドウを閉じるとサービスが停止します。
Windowsシステムでは、1つのファイルで複数のリスニングを初期化することはできません。
Linuxシステムにはこれらの制限はありませんので、本番環境ではLinuxシステムを使用することをお勧めしますが、開発環境ではWindowsシステムを選択することもできます。
2、workermanはapacheやnginxに依存しません
workerman自体が既にapache/nginxに似たコンテナであり、PHPの環境が整っていればworkermanを実行できます。
3、workermanはコマンドラインで起動します
Apacheと同様に、コマンドで起動します(通常、Webホスティングスペースでは使用できません)。起動画面は以下のようになります。(画面は参照できませんでした)
4、長い接続にはハートビートを追加する必要があります
長い接続にはハートビートが必要です。長い接続は通信がないとルートノードによってクリアされ、接続が閉じられます。workermanハートビート説明、gatewayWorkerハートビート説明
5、クライアントとサーバーのプロトコルが一致している必要があります
これは開発者にとって非常に一般的な問題です。たとえば、クライアントがwebsocketプロトコルを使用している場合、サーバーもwebsocketプロトコルを使用している必要があります(サーバーnew Worker('websocket://0.0.0.0...')
)。プロトコルが一致していないと通信ができません。ブラウザのアドレスバーでwebsocketプロトコルポートにアクセスしようとしないでください。webscoketプロトコルで裸のTCPプロトコルポートにアクセスしようとしないでください。プロトコルは必ず一致している必要があります。
ここでの原則は、イギリス人と会話をする場合には英語を使用する必要があるということと同様です。日本人と会話をする場合には日本語を使用する必要があります。ここでの言語は通信プロトコルに似ており、双方(クライアントとサーバー)が同じ言語を使用する必要があるため、それ以外の場合は通信ができません。
6、接続に失敗する可能性のある理由
workermanを始めた時によくある問題の1つは、クライアントがサーバーに接続できないことです。一般的な原因は次のとおりです:
- サーバーのファイアウォール(クラウドサーバーのセキュリティグループを含む)が接続をブロックしています(50%の可能性があります)
- クライアントとサーバーが異なるプロトコルを使用しています(30%の可能性があります)
- IPアドレスやポート番号が間違っています(15%の可能性があります)
- サーバーが起動していません
7、exitやdie、sleep文を使用しないでください
ビジネス上でexitやdie文を実行すると、プロセスが終了し、WORKER EXIT UNEXPECTEDエラーが表示されます。もちろん、プロセスが終了するとすぐに新しいプロセスが再起動してサービスを継続します。戻りたい場合はreturnを呼び出すことができます。sleep文を使用すると、プロセスがスリープ状態になり、スリープ中はビジネスを実行しないため、フレームワークも実行を停止し、そのプロセスのすべてのクライアントリクエストが処理されなくなります。
8、pcntl_fork関数を使用しないでください
pcntl_fork
は動的に新しいプロセスを作成するために使用されますが、ビジネスコードでpcntl_fork
を使用すると、リサイクルできない孤児プロセスが生成され、業務が異常となる可能性があります。ビジネス中でのpcntl_fork
は、接続、メッセージ、接続終了、タイマなどのイベントの処理に影響を与え、予測できない異常を引き起こす可能性があります。
9、ビジネスコードに無限ループを含めないでください
ビジネスコードには無限ループを含めないでください。そうしないと、制御がworkermanフレームワークに戻らず、他のクライアントのメッセージを受け取ることができなくなります。
10、コードの変更は再起動が必要です
workermanは常駐メモリのフレームワークであり、新しいコードの効果を確認するにはworkermanを再起動する必要があります。
11、長期接続アプリケーションはGatewayWorkerフレームワークを使用することをお勧めします
多くの開発者がworkermanを使用して長期接続アプリケーションを開発したいと考えていますが、たとえばインスタントメッセージ、IoTなどの長期接続アプリケーションを開発する場合は、workermanの基礎上に専用のGatewayWorkerフレームワークを使用することをお勧めします。それにより、長期接続アプリケーションのバックエンドをよりシンプルで使いやすくすることができます。
12、より高い並行性をサポート
ビジネスの同時接続数が1000を超える場合は、必ずLinuxカーネルを最適化し、event拡張機能をインストールしてください。