热搜:NVER node 开发 php

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

2024-07-28 16:00:01
求大神帮忙看看,php socket的问题

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

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

来人啊,求大神帮忙啊

找到答案了,哈