Heim  >  Artikel  >  Backend-Entwicklung  >  求大神帮忙看看,php socket的问题

求大神帮忙看看,php socket的问题

WBOY
WBOYOriginal
2016-06-23 13:23:53888Durchsuche

	$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;
    }

谢谢。可我试了下,还是有那问题

来人啊,求大神帮忙啊

找到答案了,哈

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:php 常用经验Nächster Artikel:PHP学习笔记7:错误和异常处理