ホームページ  >  記事  >  バックエンド開発  >  助けてください。phpソケットに問題があります。

助けてください。phpソケットに問題があります。

WBOY
WBOYオリジナル
2016-06-23 13:23:53888ブラウズ

	$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 入力ストリームが空に読み取られたときに、再度読み取ろうとすると、デッドロックが発生します (もう何も読み取れないため)
空の
if(rim($buf) ; を読み取るかどうかを正確に判断することが重要です。しかし、試してみましたが、まだ問題があります

誰か、助けてください

答えを見つけました、はは

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。