socket_select
在指定的超時套接字數組上運行select()系統調用
函數名:socket_select()
適用版本:PHP 4 >= 4.3.0, PHP 5, PHP 7
函數描述:socket_select()函數用於在給定的一組socket上進行阻塞式I/O操作的多路復用。它可以同時監視多個socket,以確定哪些socket上有輸入、輸出或異常事件發生。這個函數是基於操作系統提供的select系統調用實現的。
語法:int socket_select ( array &$read , array &$write , array &$except , 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);
上述示例演示了一個簡單的TCP服務器,使用socket_select()函數來實現多路復用。在循環中,通過socket_select()等待事件發生,然後根據返回結果處理不同的情況,如有新的客戶端連接、客戶端斷開連接和接收客戶端發送的數據。這種方式可以在單個線程中同時處理多個客戶端連接,提高服務器的性能和並發處理能力。