background image

else {     
/* timed out waiting; assume that all hosts associated   * with $sockets are faulty */     
foreach ($sockets as $id => $s) {      
         $status[$id] = "timed out "    
         . $status[$id];     
         }     
break;    
  }   
}   
foreach ($hosts as $id => $host) {    
      echo "Host: $hostn"; echo "Status: "    
      . $status[$id] . "nn";   
}    
?>  
我们用 stream_select()等待 sockets 打开的连接事件。stream_select()调用系统的 select(2)函数
来工 作:前面三个参数是你要使用的 streams 的数组;你可以对其读取,写入和获取异
常(分别针对三个参数)。stream_select()可以通过设 置$timeout(秒)参数来等待事件发
生-事件发生时,相应的 sockets 数据将写入你传入的参数。
下面是 PHP4.1.0 之后版本的实现,如果你已经在编译 PHP 时包含了 sockets(ext/sockets)支
持,你可以使用根上面类似的代 码,只是需要将上面的 streams/filesystem 函数的功能用
ext/sockets 函数实现。主要的不同在于我们用下面的函数代替

 stream_socket_client()来建立

连接:
                   // This value is correct for Linux, other systems have other values  
define('EINPROGRESS', 115);   
function non_blocking_connect($host, $port, &$errno, &$errstr, $timeout) {    
        $ip = gethostbyname($host);    
        $s = socket_create(AF_INET, SOCK_STREAM, 0);    
        if (socket_set_nonblock($s)) {     
           $r = @socket_connect($s, $ip, $port);     
           if ($r || socket_last_error() == EINPROGRESS) {      
                  $errno = EINPROGRESS;      
                  return $s;     
               }    
         }    
        $errno = socket_last_error($s);    
        $errstr = socket_strerror($errno);    
        socket_close($s);    
        return false;   
}   
?>  
现 在 用 socket_select() 替 换 掉 stream_select() , 用 socket_read() 替 换 掉 fread() , 用
socket_write()替换掉 fwrite(),用 socket_close()替换掉 fclose()就可以执行脚本了!

 PHP5 的

先进之处在于,你可以用 stream_select()处理几乎所有的 stream。例如你可以通过 include 
STDIN 用它接收键盘输入并保存进数组,你还可以接收通过 proc_open()打开的管道中的