現在の位置: ホーム> 最新記事一覧> socket_connectの後にsocket_set_blockを使用するための正しい姿勢

socket_connectの後にsocket_set_blockを使用するための正しい姿勢

gitbox 2025-05-26

1。socket_connectとブロッキングモードの関係

デフォルトでは、PHPのソケットはブロッキングモードであるため、接続が成功または戻ってこないまでSocket_Connectを呼び出すことがブロックされます。ただし、接続後に後続の読み取り操作がブロックされたままであることを確認する場合は、 socket_set_blockを使用して明示的に設定できます。

socket_set_blockはsocket_connect後に呼び出されて有効にする必要があることに注意する必要があります。なぜなら:

  • 接続の確立前にブロッキングモードを設定することは、 socket_connectによってリセットされる場合があります。

  • 接続後に設定すると、後続のすべての操作がブロッキングモードであることが保証されます。


2。socket_set_blockへの正しい呼び出しの例

接続が成功した後にsocket_set_blockを呼び出す方法を示す完全な例を以下に示します。

 <?php
// aを作成します TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create 失敗: " . socket_strerror(socket_last_error()) . "\n");
}

// サーバーに接続します
$address = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $address, $port)) {
    die("socket_connect 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// 接続が成功した後,ブロッキングモードを設定します
if (!socket_set_block($socket)) {
    die("socket_set_block 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// 今 socket ブロックされています,読み取りおよび書き込み操作を実行できます
$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;
}

// 閉鎖 socket
socket_close($socket);

// 出力応答
echo $response;
?>

3。注意すべき点

  • socket_connectが成功した後にsocket_set_blockが呼び出されることを確認して、接続の故障後に設定しないようにします。

  • socket_set_blockはブール値を返し、エラーメッセージはsocket_last_errorを介して失敗したときに取得できます。

  • 接続前にsocket_set_blockを呼び出すと、接続中に内部呼び出しによって上書きされ、ブロック設定が無効になる場合があります。

  • PHPのデフォルトソケットモードは通常ブロックですが、一部のシナリオ(以前に呼び出されたsocket_set_nonblockなど)では、ブロッキングに戻す必要があります。


要約すると、ブロッキングモードが有効になることを確認したい場合は、 socket_connectが成功した後にsocket_set_blockを呼び出すことです。これにより、後続の読み取り操作がブロッキング方法で実行され、データの読み取り不能や非ブロッキングモードでの書き込みの失敗などの一般的な問題を回避することです。