PHPでは、ソケットはネットワーク通信のメカニズムであり、クライアントとサーバーの間に接続が確立されます。ソケットを使用してTCP/IP接続を処理する場合、接続のシャットダウンを制御する必要があります。 Socket_shutdown()は、PHPで提供される機能であり、確立されたソケット接続をエレガントに閉じ、完全なデータ送信を確保し、異常な接続閉鎖によって引き起こされるリソース廃棄物を回避します。
この記事では、 socket_shutdown()を正しく使用する方法を詳細に調べて、ソケット接続をエレガントに閉じて、不適切な閉鎖方法によって引き起こされる潜在的な問題を回避します。
ソケットを使用してPHPで通信する場合、通常、次の手順を実行します。
ソケットの作成: socket_create()を介してソケットリソースを作成します。
バウンドソケット:IPアドレスとポート番号をSocket_Bind()を介してソケットにバインドします。
接続を聞く: socket_listen()を使用してリスニングを開始し、クライアントが接続を開始するのを待ちます。
接続を受け入れる: socket_accept()を介してクライアントの接続要求を受け入れます。
データの読み取り/書き込み: socket_read()とsocket_write()を使用してデータを送信します。
閉じるソケット:通信が完了したら、 socket_close()を呼び出してソケット接続を閉じます。
このプロセスでは、接続を優雅に閉じる必要がある場合は、 socket_shutdown()を使用して、接続の閉鎖が送信されるデータに影響を与えないようにすることができます。
socket_shutdown()は、ソケットの読み取りおよび書き込み関数をオフにするために使用され、通常はsocket_close()で使用されます。その構文は次のとおりです。
bool socket_shutdown ( resource $socket [, int $how = 2 ] )
$ socket :閉じるソケットリソースを示します。
$ how :閉じる方法を指定します。デフォルトは2です。望ましい値:
0 :ソケットの書き込み関数をオフにします。
1 :ソケットの読み取り関数をオフにします。
2 :ソケットの読み取りおよび書き込み関数をオフにします(デフォルト)。
Socket_Close()を呼び出して接続を直接閉じるだけで、データが完全に転送されない場合があります。 socket_shutdown()は保証します:
接続は、クライアントまたはサーバーがデータを書き込んだ後にのみ開始されます。
より洗練されたシャットダウンコントロールを提供し、読み取り操作を個別にオフにすることができます。
他方の端に、相手が適切な清掃作業を行う時間があるように接続が終了しようとしていることを事前に通知します。
ソケット接続を優雅に閉じる方法の基本的な例を次に示します。
<?php
// aを作成します TCP/IP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Socket 作成に失敗しました:".socket_strerror(socket_last_error());
exit;
}
// 指定されたものにバインドします IP およびポート
$bind = socket_bind($socket, '127.0.0.1', 8080);
if ($bind === false) {
echo "バインディングは失敗しました:".socket_strerror(socket_last_error());
exit;
}
// クライアントの接続を聞き始めます
$listen = socket_listen($socket);
if ($listen === false) {
echo "リスニングが失敗しました:".socket_strerror(socket_last_error());
exit;
}
echo "接続を待っています...\n";
// 接続を受け入れます
$client_socket = socket_accept($socket);
if ($client_socket === false) {
echo "接続を受け入れます失败:".socket_strerror(socket_last_error());
exit;
}
// クライアントメッセージを読む
$input = socket_read($client_socket, 1024);
echo "メッセージを受け取りました:$input\n";
// クライアントに応答を送信します
socket_write($client_socket, "受信したデータ。\n");
// 使用 socket_shutdown 接続を優雅に閉じる
socket_shutdown($client_socket, 2); // 読み取りおよび書き込み操作をオフにします
socket_close($client_socket); // 接続を完全に閉じます
// 最後にサーバーを閉じます socket
socket_shutdown($socket, 2);
socket_close($socket);
echo "接続はエレガントに閉じられています。\n";
?>
クライアントは積極的に切断されます:サーバー上のデータ送信に影響を与えずにデータを送信した後にクライアントが切断したい場合は、 socket_shutdown()を呼び出してサーバーに通知してデータの受信を停止できます。
サーバー側の接続を閉じる:サーバーがクライアント要求を処理した後、最初にデータの書き込みを閉じてから読み取り操作を閉じることができます。サーバーは、接続を閉じる前にクライアントがすべてのデータを受信することを確認する必要があります。
シーケンスの問題:Socketを閉じるとき、 Socket_Shutdown()を最初に実行する必要があり、次にSocket_Close()を呼び出す必要があります。
エラー処理: socket_shutdown()を使用する場合、タイムリーに可能なエラーに対処するために、操作の各ステップの返品値をチェックすることに注意する必要があります。
マルチスレッド/マルチ接続環境:非常に同時のネットワーク環境では、誤ったシャットダウン方法によりリソースの漏れや接続の例外を回避するために、各接続のライフサイクルを管理することに注意を払う必要があります。
socket_shutdown()は、開発者がソケット接続を優雅に閉じるのに役立つ非常に便利な機能であり、シャットダウンプロセス中にデータが失われず、他の接続に影響を与えないことを保証します。 socket_shutdown()の正しい使用は、ネットワーク通信の安定性と効率を向上させることができ、すべてのPHP開発者が習得する必要がある基本的なスキルの1つです。