二、升级:使用PHP自带异步IO去实现毫秒级超时)
说明:
异步IO:异步IO的概念和同步IO相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。异步IO将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。
多路复用:复用模型是对多个IO操作进行检测,返回可操作集合,这样就可以对其进行操作了。这样就避免了阻塞IO不能随时处理各个IO和非阻塞占用系统资源的确定。
使用 socket_select() 实现超时
- socket_select(..., floor($timeout), ceil($timeout*1000000));
select的特点:能够设置到微秒级别的超时!
使用socket_select() 的超时代码需要了解一些异步IO编程的知识去理解)
- ### 调用类 ####
- <?php
- $server = new Server;
- $client = new Client;
- for (;;) {
- foreach ($select->can_read(0) as $socket) {
- if ($socket == $client->socket) {
- // New Client Socket
- $select->add(socket_accept($client->socket));
- }
- else {
- //there's something to read on $socket
- }
- }
- }
- ?>
- ### 异步多路复用IO & 超时连接处理类 ###
- <?php
- class select {
- var $sockets;
- function select($sockets) {
- $this->sockets = array();
- foreach ($sockets as $socket) {
- $this->add($socket);
- }
- }
- function add($add_socket) {
- array_push($this->sockets,$add_socket);
- }
- function remove($remove_socket) {
- $sockets = array();
- foreach ($this->sockets as $socket) {
- if($remove_socket != $socket)
- $sockets[] = $socket;
- }
- $this->sockets = $sockets;
- }
- function can_read($timeout) {
- $read = $this->sockets;
- socket_select($read,$write = NULL,$except = NULL,$timeout);
- return $read;
- }
- function can_write($timeout) {
- $write = $this->sockets;
- socket_select($read = NULL,$write,$except = NULL,$timeout);
- return $write;
- }
- }
- ?>
PHP之友评论