ホームページ  >  記事  >  バックエンド開発  >  PHPソケットがデータフローを処理できません、それを回避する方法(ブロックされているようです)

PHPソケットがデータフローを処理できません、それを回避する方法(ブロックされているようです)

WBOY
WBOYオリジナル
2016-06-13 13:15:29856ブラウズ

PHP ソケットがデータ フローを処理できません。どうすればよいですか (ブロックされているようです)
要件: PHP は、ポート 8888 にデータを送信するハードウェアを受け入れます。受信した場合、socket_send 関数は「xFAx01x01xFFxAAxAAx00x01x00x00x00x00x00x01」を返す必要があります。ハードウェアはsocket_sendがデータを送信した後、「ピー」という音を鳴らしますが、1つのハードウェアが同時に接続され、同時にデータを送信すると問題が発生します。 、ハードウェアは継続的に応答しません (つまり、「ビープ音」が鳴り続けます)。つまり、連続的に「ビープ音」が鳴った後、約数秒後にビープ音が止まります。しばらくすると、再び動作しなくなります。これは、私が使用したいくつかのハードウェアの場合であり、非ブロッキング モードでも引き続き発生します。コードを以下に掲載します。

PHP コード

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php
error_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]);
}
?>




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