PHPでは、ネットワーク通信を処理する際には、ブロッキングモードと非ブロッキングモードの制御が非常に重要です。 socket_set_blockおよびstream_set_blockingは、一般的に使用される2つの関数です。どちらもソケットやストリームのブロッキング動作を設定するために使用されますが、該当するオブジェクトと使用量にはいくつかの違いがあります。この記事では、これら2つの機能とその使用方法の違いを詳細に紹介します。
ブロッキングモード:ファンクションコールは、データが読み取られるまでデータを読み取るなど、操作が完了するのを待機し、送信が完了するまでデータを書き込み、プログラムが一時停止して待機します。
非ブロッキングモード:機能呼び出しは、操作が完了するのを待ちません。操作をすぐに完了できない場合、すぐに戻り、プログラムは他のタスクを実行し続けることができます。
適用可能: PHPソケット拡張機能のソケットリソース( socket_create()などの機能を介して作成)
機能:ソケットをブロッキングモードに設定します。
関数プロトタイプ:
bool socket_set_block(resource $socket)
返品値:成功のためにtrueを返す、失敗のためにfalseを返す
適した: Fopen() 、 Stream_Socket_Client()によって返されるリソースなどのストリームベースのリソース、またはsocket_import_stream ()を介してsocket_create()によって変換されたストリームリソース。
機能:フローのブロッキングモードを設定します。
関数プロトタイプ:
bool stream_set_blocking(resource $stream, int $mode)
パラメーター:
$ストリーム:ストリーミングリソース
$モード:1はブロッキングを意味し、0は非ブロッキングを意味します
返品値:成功のためにtrueを返す、失敗のためにfalseを返す
特性 | socket_set_block | stream_set_blocking |
---|---|---|
適用可能なリソース | ソケット拡張機能のソケットリソース | PHPストリーミングリソース(ファイルストリーム、ネットワークストリームなど) |
ブロッキングモード設定方法 | 追加のパラメーターなしで直接呼び出します | 2番目のパラメーター(0または1)でブロッキングモードを指定します |
使用法の柔軟性 | ブロッキングのみを設定できます。 | ブロッキングまたは非ブロッキングを設定できます |
適用可能なシナリオ | 低レベルのソケットプログラミング | 高レベルのネットワークフロープログラミング |
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
socket_set_block($socket); // ブロッキングモードに設定します
// サーバーに接続します
socket_connect($socket, "gitbox.net", 80);
// リクエストを送信します
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 応答を読んでください
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
echo $response;
socket_close($socket);
?>
<?php
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
die("Connection failed: $errstr ($errno)");
}
// ブロッキングモードに設定します
stream_set_blocking($stream, 1);
// リクエストを送信します
fwrite($stream, "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n");
// 応答を読んでください
$response = '';
while (!feof($stream)) {
$response .= fread($stream, 2048);
}
echo $response;
fclose($stream);
?>
Socket_set_blockは、PHPのソケット拡張機能のソケットリソースに特別に使用され、ソケットをブロッキング状態に直接設定します。
Stream_set_blockingは、より広い範囲のストリームリソースに適しており、ブロッキングモードと非ブロッキングモードの柔軟なスイッチングを提供します。
選択する関数は、主に使用するリソースのタイプに依存します。ソケットを使用してソケットを管理する場合は、 socket_set_blockを使用します。ストリームリソース( Stream_Socket_Clientなど)を使用する場合は、 Stream_set_blockingを使用します。
これらの2つの機能とその違いを理解することで、PHPネットワークプログラミングのデータの読み取りと書き込みのデータをよりよく制御し、プログラムのパフォーマンスと応答を最適化します。