select/poll 同步非阻塞IO模型
$socket = socket_create_listen(8000) or die(“create server failed”);
socket_set_nonblock($socket);
$read = array();
while (1) {
$read = array_merge($read, array($socket));
$write = array();
$except = array();
if (true == socket_select($read, $write, $except, 0)) {
$conn = socket_accept($socket);
socket_write($conn, “hello world”);
socket_close($conn);
}
}
同步非阻塞模型比同步阻塞模型效率更高,但同步非阻塞模型也有缺点,就是Linux限制一个进程只能维持1024个连接,并且select/poll会随着连接数的增加而造成CPU消耗增加 select/poll的原理是循环检测连接是否有事件,如果维持着100W个连接,但在某个时间点只有一个连接向服务器发送数据,select/poll就需要循环100W次,而这100W次中只有一次是命中的,其余是无效的,这就白白浪费了CPU资源