socket_select
지정된 타임 아웃 소켓 어레이에서 select () 시스템 호출 실행
함수 이름 : socket_select ()
해당 버전 : PHP 4> = 4.3.0, PHP 5, PHP 7
함수 설명 : socket_select () 함수는 주어진 소켓 세트에서 I/O 작업을 멀티 플렉스하는 데 사용됩니다. 여러 소켓을 동시에 모니터링하여 입력, 출력 또는 예외 이벤트가 발생하는 소켓이 발생할 수 있습니다. 이 기능은 운영 체제가 제공 한 선택 시스템 호출을 기반으로 구현됩니다.
구문 : int socket_select (array & $ read, array & $ write, array & $, int $ tv_sec [, int $ tv_usec = 0]).
매개 변수 :
반품 값 :
예:
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($serverSocket, '127.0.0.1', 8888); socket_listen($serverSocket); $clientSockets = array($serverSocket); $write = $except = array(); while (true) { $read = $clientSockets; // 用于监视读事件的socket数组// 使用socket_select()等待事件发生if (socket_select($read, $write, $except, 0) < 1) { continue; } // 检查是否有新的客户端连接if (in_array($serverSocket, $read)) { $clientSocket = socket_accept($serverSocket); $clientSockets[] = $clientSocket; echo "New client connected." . PHP_EOL; // 从读事件数组中移除服务器socket $key = array_search($serverSocket, $read); unset($read[$key]); } // 处理已连接的客户端发送的数据foreach ($read as $clientSocket) { $data = socket_read($clientSocket, 1024); if ($data === false) { // 客户端断开连接$key = array_search($clientSocket, $clientSockets); unset($clientSockets[$key]); socket_close($clientSocket); echo "Client disconnected." . PHP_EOL; } else { // 处理客户端发送的数据echo "Received data: " . $data . PHP_EOL; } } } // 关闭服务器socket socket_close($serverSocket);
위의 예는 socket_select () 함수를 사용하여 멀티플렉싱을 구현하는 간단한 TCP 서버를 보여줍니다. 루프에서 Socket_Select ()을 통해 이벤트가 발생할 때까지 기다린 다음 새 클라이언트 연결, 클라이언트 단절 및 클라이언트가 전송하는 데이터 수신과 같은 리턴 결과에 따라 다른 상황을 처리하십시오. 이 방법은 단일 스레드에서 여러 클라이언트 연결을 동시에 처리하여 서버 성능 및 동시 처리 기능을 향상시킬 수 있습니다.