Swoole は、TCP/UDP プロトコルに基づいた高性能ネットワーク通信フレームワークです。非同期やコルーチンなどのさまざまなネットワーク プログラミング モデルを提供します。C 言語で書かれており、非常に良いパフォーマンスです。ただし、実際のプロジェクトで Swoole のパフォーマンス上の利点を最大限に活用するには、特定のシナリオに合わせて Swoole を最適化する必要があります。この記事では、サーバーのネットワーク通信パフォーマンスを最適化する方法について説明し、具体的なコード例を示します。
1. 非同期ノンブロッキング IO を利用する
Swoole は非同期ノンブロッキング IO のサポートを提供します。これは、プロセスをブロックすることなく、より多くのリクエストを処理できることを意味します。非同期 IO を使用すると、各クライアントのリクエストを独立して処理できるため、より高い同時実行性が実現します。
次のコードは、複数のクライアント接続を受け入れ、処理のために Swoole によって提供される非同期 IO 関数を使用できる単純な TCP サーバーです:
$serv = new SwooleServer('127.0.0.1', 9501); $serv->set([ 'worker_num' => 4, // 开启4个worker进程 ]); $serv->on('connect', function ($serv, $fd) { echo "Client:Connect. "; }); $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, 'Swoole: '.$data); }); $serv->on('close', function ($serv, $fd) { echo "Client: Close. "; }); $serv->start();
上記のコードでは、## を使用します。 #$serv->set() サーバーを構成するために Swoole によって提供される関数。この関数では、
worker_num パラメーターが 4 に設定されます。これは、4 つのワーカー プロセスが開始されることを意味します。クライアントが接続すると、
connect イベントがトリガーされ、このイベントに接続情報が出力されます。クライアントがデータを送信すると、
receive イベントがトリガーされ、送信されたデータがクライアントに応答されます。クライアントが接続を閉じると、
close イベントがトリガーされ、切断情報が出力されます。
$serv = new SwooleServer('127.0.0.1', 9501); $serv->set([ 'worker_num' => 4, ]); $serv->on('connect', function ($serv, $fd){ echo "Client: Connect. "; }); $serv->on('receive', function ($serv, $fd, $from_id, $data){ go(function() use ($serv, $fd, $data){ $result = dosomething($data); $serv->send($fd, $result); }); }); $serv->on('close', function ($serv, $fd){ echo "Client: Close. "; }); $serv->start(); function dosomething($data) { // do something return $result; }
go() 関数は、処理するコルーチンの作成を示します。顧客 リクエストが処理されると、結果がクライアントに返されます。 Swoole は下部でコルーチン スケジューリングを使用するため、I/O 集中型のタスクを処理する場合、コルーチン モードは従来のスレッド モードよりも優れたパフォーマンスを発揮します。
SwooleCoroutineChannel を提供します。
class MysqlPool { protected $pool; public function __construct($config, $size) { $this->pool = new SwooleCoroutineChannel($size); for ($i = 0; $i < $size; $i++) { $db = new SwooleCoroutineMySQL(); $db->connect($config); $this->put($db); } } public function get() { return $this->pool->pop(); } public function put($db) { $this->pool->push($db); } }
$db->connect() 関数を使用して接続を作成し、
$this->put() 関数を使用してその接続を接続プールに追加します。接続を使用する必要がある場合は、
$this->get() 関数を通じて接続を取得し、
$this->put() 関数を通じて接続を戻します。接続プールでの使用後の関数。
$serv->set() 関数を使用して TCP キープアライブ パラメーターを設定できます。
$serv = new SwooleServer('127.0.0.1', 9501); $serv->set([ 'worker_num' => 4, 'tcp_keepalive' => true, ]); $serv->on('connect', function ($serv, $fd){ echo "Client: Connect. "; }); $serv->on('receive', function ($serv, $fd, $from_id, $data){ $serv->send($fd, "Swoole: ".$data); }); $serv->on('close', function ($serv, $fd){ echo "Client: Close. "; }); $serv->start();
$serv = new SwooleServer('127.0.0.1', 9501); $serv->set([ 'worker_num' => 4, ]); $serv->on('connect', function ($serv, $fd){ echo "Client: Connect. "; }); $serv->on('receive', function ($serv, $fd, $from_id, $data){ $serv->send($fd, "Swoole: ".$data); }); $serv->on('close', function ($serv, $fd){ echo "Client: Close. "; }); swoole_process::signal(SIGTERM, function() use ($serv) { $serv->shutdown(); }); $serv->start();
swoole_process::signal() 関数を次の関数に渡します。 SIGTERM シグナルのコールバック イベントを登録します。シグナルを受信したら、
$serv->shutdown() 関数を実行してサーバーを停止します。
$serv->set() 関数の
ssl_cert_file および
ssl_key_file パラメータを設定することで、SSL/TLS を有効にできます。 .TLS通信。
$serv = new SwooleServer('127.0.0.1', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL); $serv->set([ 'worker_num' => 4, 'ssl_cert_file' => '/path/to/server.crt', 'ssl_key_file' => '/path/to/server.key', ]); $serv->on('connect', function ($serv, $fd){ echo "Client: Connect. "; }); $serv->on('receive', function ($serv, $fd, $from_id, $data){ $serv->send($fd, "Swoole: ".$data); }); $serv->on('close', function ($serv, $fd){ echo "Client: Close. "; }); $serv->start();
ssl_cert_file と
ssl_key_file を渡しました。 パラメータは、証明書とキー ファイルを構成します。
以上がSwoole 上級: サーバーのネットワーク通信パフォーマンスを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。