Swoole 上級: コルーチンを使用して同時サーバーを作成する
同時実行性の高いネットワーク アプリケーション シナリオでは、長距離プロセス通信フレームワークとして Swoole が開発者にますます好まれています。 Swoole は豊富なネットワーク プログラミング API を提供し、開発者が非同期プログラミングにコルーチンを使用できるようにし、同時処理能力を向上させます。この記事では、Swoole とコルーチンを使用して単純な並行サーバーを作成する方法を紹介します。
1. 環境設定
作業を始める前に、Swoole 拡張機能をインストールする必要があります。インストール方法については、Swoole の公式ドキュメントを参照してください。この記事ではPHP7.2バージョンを使用しています。
2. サーバー プログラム フレームワーク
Swoole の TCP サーバーを使用する必要があります。特定の実装では、次の側面を考慮する必要があります:
- プロトコル形式を定義する
ネットワーク アプリケーションでは、通常、標準のデータ送信形式を定義する必要があります。この例では、以下に示すように、カスタム プロトコル形式を使用できます。
class MyProtocol { const HEADER_SIZE = 4; const MAX_PACKAGE_SIZE = 1024 * 1024; public static function encode($data) { $package = json_encode($data, JSON_UNESCAPED_UNICODE); return pack('N', strlen($package)) . $package; } public static function decode($buffer) { if(strlen($buffer) < self::HEADER_SIZE) { return false; } $length = unpack('N', substr($buffer, 0, self::HEADER_SIZE))[1]; if($length > self::MAX_PACKAGE_SIZE) { return false; } if(strlen($buffer) < self::HEADER_SIZE + $length) { return false; } $package = substr($buffer, self::HEADER_SIZE, $length); return json_decode($package, true); } }
プロトコル形式には、データ パケットの長さを格納する 4 バイトのヘッダーと、実際のデータの JSON 文字列表現が含まれています。この形式はさまざまなメッセージ タイプをサポートし、送信の信頼性とスケーラビリティを実現できます。
- ビジネス処理の定義
ビジネス ロジック処理は、次に示すように、Server クラスのコールバック関数で定義されます。
class Server { private $serv; public function __construct() { $this->serv = new SwooleServer('0.0.0.0', 9501); $this->serv->set(array( 'worker_num' => 4, 'daemonize' => false, 'max_conn' => 10000, 'dispatch_mode' => 3, 'open_tcp_keepalive' => 1, 'tcp_keepidle' => 600, 'tcp_keepinterval' => 60, 'tcp_keepcount' => 5, )); $this->serv->on('Connect', array($this, 'onConnect')); $this->serv->on('Receive', array($this, 'onReceive')); $this->serv->on('Close', array($this, 'onClose')); $this->serv->start(); } public function onConnect($serv, $fd, $reactorId) { echo "Client: {$fd}-{$reactorId} Connect. "; } public function onReceive($serv, $fd, $reactorId, $data) { $message = MyProtocol::decode($data); if($message) { // Handle message & reply to client $this->serv->send($fd, MyProtocol::encode(array('status' => 0, 'message' => 'OK'))); } else { // Invalid message, close connection $this->serv->close($fd); } } public function onClose($serv, $fd, $reactorId) { echo "Client: {$fd}-{$reactorId} Close. "; } } new Server();
各接続について、サーバーは、接続、メッセージの受け入れ、接続の終了などの操作を処理する 3 つのメソッドを定義し、それに応じて応答する必要があります。
3. コルーチンの使用
Swoole は、非同期プログラミングの制御フローを管理し、同期プログラミング エクスペリエンスを提供するコルーチン API を提供します。コルーチン関数は、コルーチン シリーズ API を通じて実装できます。以下は、コルーチンを使用した後の新しいコードです。このコードは、コルーチンを使用して、クライアント接続やメッセージ受信などの非同期 IO 操作を処理します。
class Server { private $serv; public function __construct() { $this->serv = new SwooleServer('0.0.0.0', 9501); $this->serv->set(array( 'worker_num' => 4, 'daemonize' => false, 'max_conn' => 10000, 'dispatch_mode' => 3, 'open_tcp_keepalive' => 1, 'tcp_keepidle' => 600, 'tcp_keepinterval' => 60, 'tcp_keepcount' => 5, )); $this->serv->on('Connect', array($this, 'onConnect')); $this->serv->on('Receive', array($this, 'onReceive')); $this->serv->on('Close', array($this, 'onClose')); $this->serv->start(); } public function onConnect($serv, $fd, $reactorId) { go(function() use($fd, $reactorId) { echo "Client: {$fd}-{$reactorId} Connect. "; }); } public function onReceive($serv, $fd, $reactorId, $data) { go(function() use($serv, $fd, $reactorId, $data) { $message = MyProtocol::decode($data); if($message) { // Handle message & reply to client $serv->send($fd, MyProtocol::encode(array('status' => 0, 'message' => 'OK'))); } else { // Invalid message, close connection $serv->close($fd); } }); } public function onClose($serv, $fd, $reactorId) { go(function() use($fd, $reactorId) { echo "Client: {$fd}-{$reactorId} Close. "; }); } } new Server();
go(function()) を使用して、実行するタスクをコルーチンに追加します。不要なコールバック関数や制御プロセスを手動で管理する煩雑な操作を回避しながら、コード量が削減されます。
4. 導入方法
Swoole が提供するコマンド ライン ツールを使用して、サーバーの実行プロセスを簡単に管理できます。たとえば、次のように Swoole TCP サーバーを起動します。
php server.php
サーバーをバックグラウンドで実行し続ける必要がある場合は、デーモン化オプションを設定できます。
php server.php --daemonize
コマンド ライン ツールを使用します。 Swoole が提供する、サーバーのオープン、再起動、停止などの操作を行うためのツールです。
swoole_server [start|stop|reload|restart|shutdown]
Swoole を使用すると、効率的な同時ネットワーク アプリケーションを簡単に実装できます。コルーチンを使用して記述された Swoole TCP サーバーは、コード構造が簡素化されるだけでなく、パフォーマンスも向上し、従来のマルチプロセスまたはマルチスレッド サーバーと比較して、より優れた処理パフォーマンスが得られ、サーバーのリソース消費を大幅に節約できます。
以上がSwoole 上級: コルーチンを使用して同時サーバーを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go では関数とゴルーチンの間に親子関係があり、親ゴルーチンは子ゴルーチンを作成し、子ゴルーチンは親ゴルーチンの変数にアクセスできますが、その逆はできません。 go キーワードを使用して子ゴルーチンを作成すると、子ゴルーチンは匿名関数または名前付き関数を通じて実行されます。親ゴルーチンは、すべての子ゴルーチンが完了する前にプログラムが終了しないように、sync.WaitGroup を介して子ゴルーチンが完了するのを待つことができます。

Laravel で Swoole コルーチンを使用すると、大量のリクエストを同時に処理でき、次のような利点があります: 同時処理: 複数のリクエストを同時に処理できます。高いパフォーマンス: Linux の epoll イベント メカニズムに基づいて、リクエストを効率的に処理します。低リソース消費: 必要なサーバー リソースが少なくなります。統合が簡単: Laravel フレームワークとのシームレスな統合が可能で、使いやすいです。

Swoole と Workerman はどちらも高性能の PHP サーバー フレームワークです。 Swoole は、非同期処理、優れたパフォーマンス、スケーラビリティで知られており、多数の同時リクエストと高スループットを処理する必要があるプロジェクトに適しています。 Workerman は、使いやすさや同時実行量が少ないプロジェクトに適した直感的な API を備え、非同期モードと同期モードの両方の柔軟性を提供します。

同時実行性とコルーチンは、GoAPI 設計で次の目的で使用されます。 高パフォーマンス処理: 複数のリクエストを同時に処理してパフォーマンスを向上させます。非同期処理: コルーチンを使用してタスク (電子メールの送信など) を非同期に処理し、メインスレッドを解放します。ストリーム処理: コルーチンを使用して、データ ストリーム (データベース読み取りなど) を効率的に処理します。

Swoole プロセスではユーザーを切り替えることができます。具体的な手順は、プロセスの作成、プロセス ユーザーの設定、プロセスの開始です。

パフォーマンスの比較: スループット: Swoole は、コルーチン メカニズムのおかげでスループットが高くなります。レイテンシー: Swoole のコルーチン コンテキスト スイッチングは、オーバーヘッドが低く、レイテンシーが小さくなります。メモリ消費量: Swoole のコルーチンが占有するメモリは少なくなります。使いやすさ: Swoole は、より使いやすい同時プログラミング API を提供します。

Swoole サービスを再起動するには、次の手順に従います。 サービスのステータスを確認し、PID を取得します。サービスを停止するには、「kill -15 PID」を使用します。サービスの開始に使用したのと同じコマンドを使用してサービスを再起動します。

コルーチンはタスクを同時に実行するための抽象的な概念であり、ゴルーチンはコルーチンの概念を実装する Go 言語の軽量スレッド関数です。この 2 つは密接に関連していますが、Goroutine のリソース消費量は少なく、Go スケジューラによって管理されます。 GoroutineはWebリクエストの同時処理やプログラムのパフォーマンス向上など、実戦で広く活用されています。
