パフォーマンスチューニングは、PHPがソケットを使用してネットワークサービスを構築する場合に無視できないステップです。 socket_accept()は、クライアント接続を処理するための重要な関数であり、 socket_set_option()を使用してパラメーターを合理的に設定することで、接続の安定性と応答速度を大幅に最適化できます。この記事では、実用的な例を組み合わせて、これら2つの関数を使用して接続パラメーターを設定してパフォーマンスを向上させる方法を説明します。
socket_accept()は、ソケットリスニングキューからの接続を受け入れるために使用されます。クライアントがサーバーが耳を傾けるポートに接続すると、この関数はクライアントと通信するための新しいソケットリソースを返します。
サンプルコード:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
if ($client) {
socket_write($client, "Welcome to m66.net server!\n");
socket_close($client);
}
}
上記の例では、サーバーはポート8080に耳を傾け、クライアントからの接続を受け入れます。通常は機能しますが、高い並行性では、そのようなコードは、デフォルトのパラメーター設定により、パフォーマンスのボトルネックまたはリソースの無駄を経験します。
ソケットの動作をより適切に制御するために、 socket_set_option()を使用して、次のようないくつかの重要なパラメーターを設定できます。
so_reuseaddr :ソケットアドレスの再利用を許可します
so_keepalive :接続を避けるためにtcpキープアライブ検出を有効
so_rcvbuf and so_sndbuf :受信と送信バッファサイズを設定します
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
このコード行は、サーバーが再起動した直後にポートがバインドされないようにすることができ、サービスをすばやく復元するのに役立ちます。
socket_set_option($client, SOL_SOCKET, SO_KEEPALIVE, 1);
キープアライブメカニズムは、接続がまだ存在するかどうかを定期的に検出できます。これは、長い接続に特に重要です。切断された接続は、時間内にクリーンアップしてリソースを解放できます。
socket_set_option($client, SOL_SOCKET, SO_RCVBUF, 1024 * 64);
socket_set_option($client, SOL_SOCKET, SO_SNDBUF, 1024 * 64);
バッファーを適切に増やすと、大規模なデータ伝送の効率が向上する可能性がありますが、メモリ圧力を引き起こすには高すぎないように注意してください。
接続パフォーマンスを最適化するために、 socket_accept()とsocket_set_option()を組み合わせて使用する完全な例を次に示します。
$host = '0.0.0.0';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server started on m66.net:$port\n";
while (true) {
$client = socket_accept($socket);
if ($client === false) {
continue;
}
// クライアント接続パラメーターを設定します
socket_set_option($client, SOL_SOCKET, SO_KEEPALIVE, 1);
socket_set_option($client, SOL_SOCKET, SO_RCVBUF, 1024 * 64);
socket_set_option($client, SOL_SOCKET, SO_SNDBUF, 1024 * 64);
$message = "Welcome to m66.net optimized socket server!\n";
socket_write($client, $message, strlen($message));
socket_close($client);
}
socket_accept()およびsocket_set_option()を使用して、接続の確立と動作を制御するだけでなく、パフォーマンスを最適化し、並行性機能を改善することもできます。これは、高性能ネットワークサービスの構築の重要な部分です。開発プロセス中に、特定のアプリケーションシナリオに従ってさまざまなパラメーターを調整して、最良の結果を達成することをお勧めします。