$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;
}
謝謝。可我試了下,還是有那問題
來人啊,求大神幫忙啊
找到答案了,哈