socket_set_nonblock
파일 디스크립터 FD에 대한 비 차단 모드를 설정하십시오
함수 이름 : socket_set_nonblock ()
해당 버전 : PHP 4> = 4.1.0, PHP 5, PHP 7
사용법 : socket_set_nonblock (Resource $ socket)
함수 설명 : socket_set_nonblock () 함수는 주어진 소켓을 비 블로킹 모드로 표시하므로 데이터를 읽고 쓰면 프로세스가 차단되지 않음을 의미합니다.
매개 변수 :
반환 값 : 성공시 사실, 실패에 대한 거짓.
예:
<?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 () 함수를 사용하여 소켓을 비 블로킹 모드로 설정합니다. 다음으로 서버에 연결하려고합니다. 연결이 실패하면 오류 코드를 기반으로 연결이 진행 중인지 확인합니다. 그런 다음 데이터를 읽으려고합니다. 읽을 수있는 데이터가 없으면 오류 코드를 기반으로 읽을 데이터가 없는지 판단합니다. 마지막으로 데이터를 작성하려고합니다. 데이터를 즉시 작성할 수없는 경우 오류 코드에 따라 즉시 작성할 수 없는지 판단합니다. 마지막으로 소켓을 닫습니다.
비 블로킹 모드에서는 대기를 차단하는 대신 일부 작업이 즉시 돌아올 수 있습니다. 따라서 반환 값 또는 오류 코드에 따라 해당 상황을 처리해야합니다.