ホームページ >バックエンド開発 >PHPチュートリアル >PHPソケットがデータフローを処理できない、その対処方法(ブロックされているようです)
php ソケットがデータ フローを処理できません、その回避方法 (ブロックされているようです)
php ソケットがデータ フローを処理できません、それに対処する方法 (ブロックされているようです)
要件: PHP は、ハードウェアがポート 8888 にデータを送信すると、socket_send 関数は「xFAx01x01xFFxAAxAAx00x01x00x00x00x00x00x01」を返すはずですが、ハードウェアが 1 つあれば問題は発生しません。ただし、複数のハードウェアが同時に接続されている場合、同時にデータを送信すると、ハードウェアが応答し続けることができない(つまり、「ビープ」音が鳴る)状況が発生します。 、「ビープ音」が鳴り続けた後、数秒後に再び反応し始めます。いくつかの接続上のハードウェアは次のようになります。ノンブロッキングモードを使用しましたが、依然として発生します。解決策を探している場合、コードを以下に掲載します
<?phperror_reporting(E_ALL);set_time_limit(0);ini_set("allow_call_time_pass_reference",true);//监听端口$PORT = 8888;//最大连接池$MAX_USERS = 50;//创建监听端口//$sock = socket_create_listen($PORT);$commonProtocol = getprotobyname("tcp");$sock = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);@socket_bind($sock, '192.168.1.112@socket_listen($sock);if (!$sock){ exit(1);}//不阻塞socket_set_nonblock($sock);$connections = array();$input = array();$close = array();while (true){ //sleep(3); $readfds = array_merge($connections, array($sock)); $writefds = array(); //选择一个连接,获取读、写连接通道 if (socket_select($readfds, $writefds, $e = null, $t=60)) { foreach ($readfds as $rfd) { //如果是当前服务端的监听连接 if ($rfd == $sock) { //接受客户端连接 $newconn = socket_accept($sock); $i = (int)$newconn; $reject = ''; if (count($connections) >= $MAX_USERS) { $reject = "Server full. Try again later.\n"; } //将当前客户端连接放如socket_select选择 $connections[$i] = $newconn; //输入的连接资源缓存容器 $writefds[$i] = $newconn; //连接不正常 if ($reject) { $close[$i] = true; } else { echo "Welcome to the PHP Chat Server!\n"; } //初始化当前连接读取内容的缓存容器 $input[$i] = ""; continue; } //客户端连接 $i = (int)$rfd; //读取 $tmp = @socket_read($rfd, 14, PHP_NORMAL_READ); if (!$tmp) { //读取不到内容 print "connection closed on socket $i\n"; close($i); continue; } $input[$i] .= $tmp; $tmp = substr($input[$i], -1); /*if ($tmp != "\r" && $tmp != "\n") { // no end of line, more data coming continue; }*/ $line = trim($input[$i]); $input[$i] = ""; echo 'Client >>'.$line."\r\n"; socket_getpeername($connections[$i],&$remoteIP,&$remotePort);echo $remoteIP."\r\n";echo $remotePort."\r\n";//$data=str_split($buffer);//print_r($data);$str="\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01"; socket_send($connections[$i],$str,strlen($str),0); } foreach ($writefds as $wfd) { $i = (int)$wfd; $w = socket_write($wfd, "hello"); } } }function close($i){ global $connections, $input, $close; socket_shutdown($connections[$i]); socket_close($connections[$i]); unset($connections[$i]); unset($input[$i]); unset($close[$i]);}?>