$appenStr = $buf = ''; $time = time(); for($i=0;$i<100;$i++){ $buf = socket_read($msgsock, 8192); if(time() - $time > 5){ break; } if($buf){ $appenStr .= $buf; }else{ break; } } echo $appenStr;
网上看了很多资料,是socket_read这个函数阻塞了,导致的客户端程序一直假死状态,一直等待上面代码的结果 返回。
但是我这样就能取出来数据了。
$buf = socket_read($msgsock, 8192); $buf .= socket_read($msgsock, 8192); $buf .= socket_read($msgsock, 8192);可是总不能算好字节数去取吧。还有下面的代码我也试过了,还是假死,一直在加载中。
$appenStr = $out = ''; $start_time = time(); do{ if (false === ($out = socket_read($msgsock, 8192))) { echo ("SOCKET_READ_ERROR: " . socket_strerror(socket_last_error($msgsock))); $str = ""; break; } if (time() - $start_time > 1) { echo ("SOCKET_READ_ERROR: Timeout!!!"); $str = ""; break; } $appenStr .= $out; } while ($out != "");
求大神指导
回复讨论(解决方案)
如果在输入流已经读空的情况下,你再去读,就会出现死锁(因为再也读不到东西了)
所以准确的判断是否读空是很重要的
if( trim($buf )){
$appenStr .= $buf;
}else{
break;
}
如果在输入流已经读空的情况下,你再去读,就会出现死锁(因为再也读不到东西了)
所以准确的判断是否读空是很重要的
if( trim($buf )){
$appenStr .= $buf;
}else{
break;
}
来人啊,求大神帮忙啊
找到答案了,哈