PHPネットワークプログラミングでは、マルチプレックスの取り扱いは、効率的なネットワークサービスを達成するための重要なテクノロジーです。 socket_set_optionとsocket_selectは、PHPソケットプログラミングの2つの重要な機能です。多くの開発者は、特にマルチプレックスを実装する際に正しく一致する方法を一緒に使用できるかどうか疑問に思うでしょう。
この記事では、 socket_set_optionとsocket_selectの役割を詳細に説明し、それらを一緒に使用できるかどうかを議論し、それらを使用してマルチプレックスを実現する方法を紹介します。
socket_set_optionは、タイムアウト時間、アドレスの再利用、バッファサイズの送信/受信などのソケットのオプションを設定するために使用されます。その機能は、ソケットの動作特性を調整することです。
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
上記のコードは、ソケットのアドレス再利用オプションを設定します。これは、サーバーが再起動するときにポートをすばやくバインドするためによく使用されます。
Socket_Selectは、多重化を実装する重要な関数です。複数のソケットを聴くために使用され、1つ以上のソケットが読み書きができたら、関数が戻ります。これにより、シングルスレッドプログラムが複数の接続を同時に処理できます。
$read = [$socket1, $socket2];
$write = null;
$except = null;
$timeout = 5;
$num_changed = socket_select($read, $write, $except, $timeout);
socket_selectは、$ read 、 $ write 、および$を変更することにより、準備されたソケットを返します。
答えはイエスですが、2つの関数は異なります。一緒に使用する場合、使用を明確に区別する必要があります。
Socket_set_optionは、ソケットの動作(タイムアウト、バッファなど)の構成に使用されます。
socket_selectは、複数のソケットが読みやすいか、書くことができるか、例外があるかを聞くために使用されます。
多重化は主にSocket_Selectに依存しますが、 Socket_set_optionはソケットのプロパティのみを調整します。通常は、ソケットが作成された後、 Socket_Selectが使用される前に設定されます。
以下は、 socket_selectを使用して複数のクライアント接続のマルチプレックスのリスニングにsocket_set_optionを使用してソケットオプションを設定する方法を示す簡単なサーバーの例です。
<?php
// 作成する TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
// バインドポート
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
$clients = [];
$read = [$server];
while (true) {
$readSockets = $read;
$write = null;
$except = null;
// 複数を聞いてください socket 変更
$numChanged = socket_select($readSockets, $write, $except, 5);
if ($numChanged === false) {
echo "socket_select エラーが発生しました\n";
break;
} elseif ($numChanged > 0) {
// 新しいクライアント接続を聞いてください
if (in_array($server, $readSockets)) {
$newClient = socket_accept($server);
if ($newClient !== false) {
socket_set_option($newClient, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
$clients[] = $newClient;
$read[] = $newClient;
echo "新しいクライアント接続\n";
}
unset($readSockets[array_search($server, $readSockets)]);
}
// 既存のクライアントが送信したデータを処理します
foreach ($readSockets as $socket) {
$data = socket_read($socket, 1024, PHP_NORMAL_READ);
if ($data === false || $data === '') {
// 接続が閉じます
socket_close($socket);
unset($clients[array_search($socket, $clients)]);
unset($read[array_search($socket, $read)]);
echo "クライアントが切断されました\n";
} else {
$data = trim($data);
echo "クライアントデータを受信しました: $data\n";
// 応答を送信します
socket_write($socket, "サーバーが受信されました: $data\n");
}
}
}
}
socket_close($server);
キーポイント説明:
サーバーソケット$サーバーは、 so_reuseaddrをsocket_set_optionで設定して、ポートの迅速な再利用を確保します。
新しいクライアント接続が確立された後、受信タイムアウトオプションもsocket_set_optionで設定されます。
Socket_Selectは、すべてのアクティブなクライアントソケットとサーバーソケットに耳を傾け、多重化メカニズムが適切に機能するようにします。
socket_set_optionとsocket_select関数は異なりますが、組み合わせて使用することができます。
Socket_set_optionは、ソケットパラメーターの構成とネットワークのパフォーマンスと動作の最適化を担当します。
Socket_Selectは、複数のソケットイベントの多重化とリスニングを担当します。
これら2つの機能を合理的に使用すると、効率的で安定したネットワークサーバープログラムを作成できます。
PHPソケットの多重化を詳細に学習したい場合は、公式ドキュメントや関連するネットワークプログラミングブックを参照して、詳細と高度なスキルを習得することもできます。
記事の例のURLドメイン名は次のとおりです。
$url = "https://gitbox.net/api/socket_demo";