過去 6 か月間で、私は PHP と Java テクノロジー スタックを使用したゲーム サーバー プロジェクトを完了しました。プロジェクトには高頻度のネットワーク リクエストがあるため、PHP テクノロジ スタックは、Swoole エンジン (高性能イベントベースの非同期並列ネットワーク通信エンジン) を使用して、ゲーム ビジネスの一部を完了しようとしました。
推奨 (無料): swoole
Swoole のインストール
Swoole のインストールは非常に簡単です。これは中国人によって行われたプロジェクトであるため、多くの問題に対する答えは公式 Web サイトのドキュメントで見つけることができます。インストールには、
具体的な手順については、Baidu をクリックしてください。インターネット上には関連コンテンツがたくさんあります。
Swoole エンジンの利点
Swoole の動作フローチャートは次のとおりです。
Swoole のスレッドまたはプロセス
##構造図は次のとおりです。
Swoole エンジンは 2 つのモードに分かれています。シングルスレッドモードとプロセスモード。この記事ではプロセス モードについてのみ説明します。 2 つの具体的な違いについては、公式ドキュメントで説明されています。 マスター プロセスReactor スレッドSwoole のメインプロセスは、次のようなマルチスレッドプログラムです。 。 Reactor スレッドと呼ばれる非常に重要なスレッドのグループがあります。実際に TCP 接続を処理し、データを送受信するのはスレッドです。# は、クライアントやローカル通信パイプからの接続などのスウールのコア イベントを処理するために使用されます。マスター プロセスには複数のスレッドがあり、各スレッドは epol 関数のインスタンスを実行します。 (Worker プロセスは Master プロセスによってフォークされていないため、Master プロセスを強制終了しても Worker プロセスが存在する可能性があります)
新しい接続を受け入れた後、Swoole のメイン スレッドはその接続を固定 Reactor スレッドに割り当て、このスレッドがソケットの監視を担当します。ソケットが読み取り可能なときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。ソケットが書き込み可能なときに TCP クライアントにデータを送信します。
swoole のワーカー/タスク プロセスはすべてフォークされ、マネージャー プロセスによって管理されます。
子プロセスが終了すると、マネージャー プロセスは、ゾンビ プロセスになるのを避けるために子プロセスをリサイクルする責任があります。そして、新しいサブプロセスを作成します。
ワーカー プロセス
Swoole は完全なプロセス管理メカニズムを提供します。致命的な PHP エラーなど、ワーカー プロセスが誤って異常終了した場合、他のプログラムによって強制終了されたか、max_request 数に達した後に正常に終了しました。メインプロセスは新しいワーカープロセスを再起動します。通常のapache phpやphp-fpmと同様にワーカープロセス内でコードを記述することができます。 Node.js のような非同期コールバック コードを記述する必要はありません。
マスターのコールバック関数:
onStart
onShutdownManager程序內的回呼函數
Reactor、Worker、TaskWorker的關係
#可以理解為Reactor就是nginx,Worker就是php-fpm。 Reactor執行緒非同步並行地處理網路請求,然後再轉送給Worker進程中去處理。 Reactor和Worker間透過UnixSocket進行通訊。
在php-fpm的應用中,常常會將一個任務非同步投遞到Redis等佇列中,並在背景啟動一些php進程非同步地處理這些任務。 Swoole提供的TaskWorker是一套更完整的方案,將任務的投遞、佇列、php任務處理程序管理合為一體。透過底層提供的API可以非常簡單地實現非同步任務的處理。另外TaskWorker還可以在任務執行完成後,再回傳一個結果回傳到Worker。
Swoole的Reactor、Worker、TaskWorker之間可以緊密的結合起來,提供更進階的使用方式。一個更通俗的比喻:假設Swoole應用伺服器是一個工廠,那麼Reactor就是銷售,接受客戶訂單。而Worker就是工人,當銷售接到訂單後,Worker去工作生產客戶要的東西。而TaskWorker可以理解為行政人員,可以幫助Worker做些雜事,讓Worker專心工作。
底層會為Worker進程、TaskWorker進程分配一個唯一的ID。不同的Worker和TaskWorker進程之間可以透過sendMessage介面進行通訊。
實際專案中的各行程執行緒的分工:
Swoole版本相容性
該專案開發階段使用的swoole引擎版本1.9.6,後來由於測試環境安裝成了4.3.2版本,所以嘗試業務程式碼作調整。不過swoole的向下相容很值得佩服的是,這過程中竟然只發現了一處代碼不相容的問題:是有關swoole_server的一項配置參數,在原來版本採用了魔鬼數字進行配置的,但是到新版本,這個數字沒有被巨集定義,後來透過查看swoole源碼找到了巨集定義組,然後修改了這處組態。 (不過版本升級順利也是基於swoole的業務代碼比較少,所以僅供參考
更多相關學習推薦:swoole教程
以上がSwoole エンジンの原理を共有するための簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。