PHPでネットワークをプログラミングする場合、2つの機能Socket_Shutdown()とSocket_Close()がよく使用されます。どちらの関数もソケット接続を閉じることに関連していますが、それらは異なる動作と適用されます。これら2つの機能の違いを理解することは、ネットワーク接続を効果的に管理するために非常に重要です。この記事では、これら2つの機能の違いを掘り下げ、ソケット接続を閉じるために適切な関数を選択するのに役立ちます。
socket_shutdown()関数は、ソケットの特定の部分を閉じるために使用され、より細かい粒状制御で接続を管理できます。すぐにソケットリソースを破壊するわけではありませんが、接続を閉じるときに閉じる必要がある方向を指定することができます。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_shutdown</span></span><span>(resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$how</span></span><span> = </span><span><span class="hljs-number">2</span></span><span>)
</span></span>
$ socket :閉じる必要があるソケットリソース。
$ how :閉じる方法を指定します。それは次の値である可能性があります:
0 :接続の送信方向を閉じます(つまり、書き込み操作を閉じます)が、それでもデータを受信できます。
1 :接続の受信方向を閉じます(つまり、読み取り操作を閉じます)が、それでもデータを送信できます。
2 :同時に読み取りと書き込み操作を閉じます(これはデフォルト値です。つまり、接続が完全に閉じられていることを意味します)。
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>);
</span><span><span class="hljs-comment">// データ送信が完了したとします,しかし、私はデータの受信を継続したいと考えています</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>); </span><span><span class="hljs-comment">// 送信方向のみをオフにします</span></span><span>
</span><span><span class="hljs-comment">// その後、データを受け取ることができます</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span></span>
socket_shutdown()は、通常、次のシナリオで使用されます。
通信中、データは一方向に閉じられますが、他の方向の接続はまだ維持されています(たとえば、データを送信した後にデータを受信する必要があります)。
プロトコル要件の場合、データの損失を防ぐためにデータ送信を優雅に終了します。
socket_shutdown()とは異なり、 socket_close()関数はソケット接続を完全に閉じ、それに関連するすべてのリソースを解放するために使用されます。この関数を呼び出した後、ソケットはもはや有効ではなく、データ送信には使用できません。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(resource </span><span><span class="hljs-variable">$socket</span></span><span>)
</span></span>
$ソケット:閉じるソケットリソース。
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8080</span></span><span>);
</span><span><span class="hljs-comment">// データ交換を完了した後,閉鎖 socket 接続する</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>
socket_close()は、次のシナリオに適しています。
接続を完全に終了し、相手と通信する必要がなくなりました。
ソケットがすべてのタスクを完了したら、リソースをリリースして、メモリリークがないことを確認します。
特性 | socket_shutdown() | socket_close() |
---|---|---|
関数 | ソケットの特定の方向を閉じます(読み取り、書き込み、またはその両方) | ソケットを完全に閉じて、すべてのリソースをリリースします |
リソースをリリースするかどうか | ソケットはリソースをリリースせずにまだ有効ですが、一部の機能は無効です | すべてのリソースをリリースすると、ソケットは使用できなくなります |
使用 | 接続を優雅に閉じる必要があるシナリオで使用され、データを送信して受信し続けることができます | 接続が完全に終了し、通信を必要としなくなったときに使用されます |
パラメーター | 読書、書き込み、またはその両方の方向をオフにすることを選択できます | パラメーターはありません。ソケットリソースを渡すだけです |
socket_shutdown()またはsocket_close()を使用することを選択する場合、次の要因が主に考慮されます。
接続の特定の方向を閉じたい場合(たとえば、送信後にデータを送信するのではなく、データを受信する必要はありません)、 socket_shutdown()を使用すると、より適切な選択肢があります。
接続を完全に閉じて、すべてのリソースを解放してメモリリークを防ぐ場合は、 socket_close()を使用することが正しい選択です。
場合によっては、 socket_shutdown()を呼び出して接続を優雅に閉じてから、 socket_close()を呼び出してリソースを完全に解放できます。これを行うことで、接続を閉じる前にすべての操作がスムーズに行われることが保証されます。
PHPネットワークプログラミングでは、ソケット接続を適切に管理するためには、 socket_shutdown()とsocket_close()の違いを理解することが重要です。 socket_shutdown()は、接続の部分的な方向を閉じるためにより細かい粒状制御を提供しますが、 socket_close()は完全にリソースを完全に解放して切断するために使用されます。プログラムの安定性とパフォーマンスを確保するために、ニーズに応じて適切な関数を選択します。