IO多路复用技术 这个功能被广泛使用,nginx redis nodejs 都在使用,多路是指多个客户端连接socket 复用 就是指复用小数几个进程
举个例子来理解IO多路复用
教室里有10个学生和1个老师,孩子不停的向老师提问,一个老师忙不过来了 学校只能给每位学生配一位老师,如果学生比作为客户端,教师当做成与客户端进行数据交互的服务器进程,则该教室的运营方式为多进程服务端的方式
有一天学校里来个牛逼老师,可以应对所有学生的回答,而且回答速度很快,不会让学生等待,现在一个教室只需要一位老师了,现在学生提问前必须举手,老师确认只有举手的学生提问后再回答问题,此时 这种方式就是I/O复用的方式运行
当启动select后 需要将三组不同的socket fd 加入到作为select的参数,fd集合也就是fd_set 三组fd_set 分别为 可读集合,可写集合 ,异常集合.这三组集合 有内核来维护,每当select 监控的这三个fd_set 有 有可读或可写或异常出现的时候,就会通知调用方,调用方调用select后,调用方就被阻塞,等待可读可写异常事件的发生,一旦有事件发生,需要将这三个集合 由内核态copy到用户态中,然后调用方通过轮询的方式遍历所有fd,从中读取出可读可写异常的fd
<?php
$port = 9501;
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_option($sock,SOL_SOCKET,SO_REUSEADDR,1);
socket_bind($sock,0,$port);
socket_listen($sock);
//socket创建一把梭
//将监听socket 加入到read fd set中去 因为select也要监听监听socket上发生的事件
//比如有客户端连接过来 就监听到了
$clients = [$