在上一篇文章《大略理解PHP之socket编程(二)》中,我们是利用非壅塞模式去实现单一做事端连接多个客户真个,即先利用函数socket_set_nonblock()设置套接字为非壅塞模式,然后将连接到做事真个客户端连接放到一个数组中,末了通过遍历客户端数组,分别与每一个客户端进行数据交互。

本文我们将先容,如何通过利用PHP函数socket_select(),来实现单一做事端连接多个客户端。

首先,我们来看下socket_select()是做什么的。

php连接socketPHP编程简略懂得PHP之socket编程三 Node.js

上图是从PHP手册上截取下来的。
从图中语句,我们可以得知,利用socket_select()函数,我们可以在指定的套接字上调用系统的select机制,从而实现I/O 多路复用。

那什么是IO多路复用呢?

I/O多路复用实际上便是用select, poll, epoll(这里即时select)监听多个I/O 工具,当I/O 工具有变革(有数据)的时候就关照用户进程,这样单个进程可以处理多个socket。
如下:

当用户进程调用了select,那么全体进程会被block(壅塞);

而同时,kernel会“监视”所有select卖力的socket;

当任何一个socket中的数据准备好了,select就会返回;

这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

以是,I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符),个中的任意一个进入读就绪状态,select()函数就可以返回。

代码实现如下:

做事端server.php

客户端与之前一样,保持不变。