socket_set_nonblock
ファイル記述子FDの非ブロッキングモードを設定します
関数名:socket_set_nonblock()
該当するバージョン:PHP 4> = 4.1.0、PHP 5、PHP 7
使用法:socket_set_nonblock(リソース$ socket)
関数の説明:socket_set_nonblock()関数は、指定されたソケットを非ブロッキングモードとしてマークします。つまり、データの読み取りと書き込みの際にプロセスがブロックされません。
パラメーター:
返品値:成功の真のリターン、および失敗にfalseを返します。
例:
<?php // 创建套接字$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 设置套接字为非阻塞模式if (socket_set_nonblock($socket)) { echo "套接字设置为非阻塞模式成功!\n"; } else { echo "套接字设置为非阻塞模式失败!\n"; } // 连接到服务器if (socket_connect($socket, '127.0.0.1', 8080) === false) { // 非阻塞模式下,连接可能会立即返回失败$error = socket_last_error($socket); if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) { echo "连接服务器失败:" . socket_strerror($error) . "\n"; } else { echo "连接正在进行中...\n"; } } // 读取数据$data = socket_read($socket, 1024); if ($data === false) { // 非阻塞模式下,如果没有数据可读取,会立即返回false $error = socket_last_error($socket); if ($error != SOCKET_EAGAIN) { echo "读取数据失败:" . socket_strerror($error) . "\n"; } else { echo "没有可读取的数据。\n"; } } // 写入数据$message = "Hello, Server!"; if (socket_write($socket, $message, strlen($message)) === false) { // 非阻塞模式下,如果无法立即写入数据,会立即返回false $error = socket_last_error($socket); if ($error != SOCKET_EAGAIN) { echo "写入数据失败:" . socket_strerror($error) . "\n"; } else { echo "无法立即写入数据。\n"; } } // 关闭套接字socket_close($socket); ?>
上記の例では、最初にソケットを作成し、次にsocket_set_nonblock()関数を使用して、ソケットを非ブロッキングモードに設定します。次に、サーバーに接続しようとします。接続が失敗した場合、エラーコードに基づいて接続が進行中かどうかを判断します。次に、データを読み取ろうとします。読み取り可能なデータがない場合、エラーコードに基づいて読み取るデータがないかどうかを判断します。最後に、データを作成しようとします。データをすぐに記述できない場合、エラーコードに基づいてすぐに記述できないかどうかを判断します。最後に、ソケットを閉じます。
非ブロッキングモードでは、待機をブロックする代わりに、一部の操作がすぐに戻る場合があることに注意してください。したがって、返品値またはエラーコードに基づいて、対応する状況を処理する必要があります。