php select socket

因为客户端是长连接,如果客户端非正常断开,服务端会在socket_accept阻塞,现在使用select非阻塞模式socket,读取客户端信息。

 1 <?php 
 2 date_default_timezone_set("Asia/Shanghai");
 3 include_once "Db.php";
 4 $sfd = socket_create(AF_INET, SOCK_STREAM, 0); 
 5 socket_bind($sfd, "192.168.191.1", 9001); 
 6 socket_listen($sfd, 10); //监听10个
 7 socket_set_option($sfd, SOL_SOCKET, SO_REUSEADDR, 1); //重用端口
 8 socket_set_nonblock($sfd); //非阻塞
 9 $rfds = array($sfd); 
10 $wfds = array(); 
11 do{ 
12     $rs = $rfds;  
13     $ws = $wfds; 
14     $es = array(); 
15     $ret = socket_select($rs, $ws, $es, 3); 
16     //read event 
17     foreach($rs as $fd){
18             
19         if($fd == $sfd){ 
20             $cfd = socket_accept($sfd); 
21             socket_set_nonblock($cfd); 
22             $rfds[] = $cfd; 
23             echo "new client coming, fd=$cfd
"; 
24         }else{
25             //获取客户端IP地址
26             socket_getpeername($fd, $addr, $port);
27             //读取客户端信息
28             $msg = socket_read($fd, 1024); 
29             echo date("H:i:s")." $fd $msg";
30             $arr=explode(",", $msg);
31             //更新到数据库 
32             $sql = "update test set wendu = $arr[0],shidu = $arr[1], green = $arr[2],yellow=$arr[3] ,red=$arr[4],dianliu=$arr[5],
             dianya=$arr[6] where ip = '$addr'" ; 33 Db::query($sql); 34 } 35 } 36 37 38 }while(true);
原文地址:https://www.cnblogs.com/yuanlipu/p/6431834.html