まず、 stream_socket_shutdown関数の基本的な構文を見てみましょう。
bool stream_socket_shutdown ( resource $stream , int $how )
$ stream : stream_socket_clientやstream_socket_serverなどの関数を通じて開かれたソケットリソースです。
$ how :操作を閉じる方法です。次の定数のいずれかを使用できます。
Stream_shut_rdwr :同時に読み取りと書き込み操作を閉じます。
stream_shut_rd :読み取り操作を閉じます。
stream_shut_wr :書き込み操作を閉じます。
TCPプロトコルは接続指向です。つまり、接続は通信前に確立する必要があり、通信が完了した後に接続を優雅に閉じる必要があります。 TCP接続におけるStream_Socket_Shutdown関数の役割は特に重要です。特にデータ転送を実行した後、リソースの漏れを避けるために接続が正しく閉じられていることを確認する必要があります。
Stream_socket_clientまたはstream_socket_serverを使用して、接続を確立します。
データ転送が完了したら、 stream_socket_shutdown($ stream、stream_shut_wr)を使用して書き込み操作を閉じます(リモートホストにデータを送信しないことを伝えます)。
次に、リモートホストがデータ送信を完了し、接続を閉じるのを待ちます。通常、 stream_socket_shutdown($ stream、stream_shut_rd)を使用して読み取り操作を閉じます。
典型的なTCP接続シャットダウン例:
$stream = stream_socket_client("tcp://m66.net:80", $errno, $errstr);
if (!$stream) {
echo "Error: $errno - $errstr\n";
} else {
fwrite($stream, "GET / HTTP/1.1\r\nHost: m66.net\r\nConnection: close\r\n\r\n");
// 書き込み操作を閉じます,データが送信されなくなったことを示します
stream_socket_shutdown($stream, STREAM_SHUT_WR);
// 応答を読んでください
while ($response = fgets($stream)) {
echo $response;
}
// 読み取り操作を閉じます,接続を閉じます
stream_socket_shutdown($stream, STREAM_SHUT_RD);
fclose($stream);
}
TCPプロトコルでは、 Stream_Socket_Shutdownを使用すると、読み取り操作を個別にオフにすることができます。これは、接続を優雅に閉じる必要があるシナリオに非常に役立ちます。
Stream_shut_wrを使用する場合、リモートホストは通常、「接続シャットダウン」信号を受け取ります。これは、接続を閉じてリソースを解放します。
TCPプロトコルとは異なり、UDPはコネクションレスプロトコルであるため、UDPプロトコルで永続的な接続を確立する必要はなく、TCPのようにエレガントに接続を閉じる必要もありません。 UDPにはデータフローや接続シャットダウンの制御が含まれないため、 Stream_Socket_shutdownはUDPプロトコルでの役割が限られています。
stream_socket_clientまたはstream_socket_serverを使用して、UDPソケットを作成します。
Packetを送信した後、UDP通信には「接続」の概念がないため、 Stream_Socket_Shocke_shutdownを明示的に読み取りおよび書き込み操作を閉じる必要はありません。
UDPデータ送信の典型的な例:
$stream = stream_socket_client("udp://m66.net:12345", $errno, $errstr);
if (!$stream) {
echo "Error: $errno - $errstr\n";
} else {
fwrite($stream, "Hello, UDP server!");
fclose($stream);
}
UDPプロトコルでは、 stream_socket_shutdown関数を通常呼び出す必要はありません。 UDPプロトコル自体には接続の明確な概念がないため、それが呼び出されたとしても、動作はTCPのように接続に影響しません。
したがって、UDPアプリケーションシナリオでは、 Stream_Socket_Shutdown関数を使用しても、データ送信の動作が大きく変化しません。
TCPおよびUDPプロトコルでのStream_Socket_Shutdown関数の適用には明らかな違いがあります。 TCPプロトコルの場合、接続を優雅に閉鎖し、データ送信が完了し、リソースを解放するのに役立ちます。 UDPプロトコルでは、その接続のない性質のため、 Stream_Socket_Shutdownの役割はそれほど重要ではなく、通常使用する必要はありません。
開発者がStream_Socket_Shutdownを使用する場合、実際のプロトコルタイプに基づいて適切なシャットダウン方法を選択する必要があります。 TCPプロトコルでは、 Stream_shut_wrとstream_shut_rdの合理的な使用により、接続の正しいシャットダウンとリソースのタイムリーなリリースを確保できます。 UDPプロトコルでは、この関数は通常必要ありません。