Php Websocket服务器没有';不允许从客户端进行新连接,卡在套接字读取位置(无错误)

Php Websocket服务器没有';不允许从客户端进行新连接,卡在套接字读取位置(无错误),php,linux,sockets,tcp,websocket,Php,Linux,Sockets,Tcp,Websocket,我有用原生php编写的websocket服务器。我在linux的屏幕上运行服务器 它很好用。客户端可以连接到Web服务器。但是几天后(不确定有多少天,随机发生),websocket不再接受新连接 set_time_limit(0); if(!($socket = socket_create(AF_INET, SOCK_STREAM, 0))){ $error_code = socket_last_error(); $error_msg = socket_strerror($er

我有用原生php编写的websocket服务器。我在linux的屏幕上运行服务器

它很好用。客户端可以连接到Web服务器。但是几天后(不确定有多少天,随机发生),websocket不再接受新连接

set_time_limit(0);

if(!($socket = socket_create(AF_INET, SOCK_STREAM, 0))){
    $error_code = socket_last_error();
    $error_msg = socket_strerror($error_code);
    die();
}

if(!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)){
    $error_code = socket_last_error();
    $error_msg = socket_strerror($error_code);
    die();
}

if(!socket_bind($socket, 0, $port)){
    $error_code = socket_last_error();
    $error_msg = socket_strerror($error_code);
    die();
}

if(!socket_listen($socket))
{
    $error_code = socket_last_error();
    $error_msg = socket_strerror($error_code);
    die();
}

/**
 * array of client sockets
 **/
$clientSockets = array($socket);
$socketLists = array();

$write = null;
$except = null;
$header = array();

/**
 * start endless loop, so that our script doesn't stop
 **/
while (true) {
    /**
    * array of sockets to read
    * !get from clientSockets array
    **/
    $readSockets = $clientSockets;

    /**
    * now call select - blocking call
    **/
    if(socket_select($readSockets , $write , $except , 0, 10) === false)
    {
        $error_code = socket_last_error();
        $error_msg = socket_strerror($error_code);

        error_log('Could not listen on socket: ['.$error_code.'] '.$error_msg.'\n');
    }

    if(in_array($socket, $readSockets)){
        /**
        * Accept new client socket
        **/
        if(($new_client_socket = socket_accept($socket)) !== false){
            error_log('Websocket has new connection');
            /**
            * Add new client socket to client socket array
            **/
            $clientSockets[] = $new_client_socket;

            /**
            * read data sent by the socket buffer(65536, 65536)
            **/
            error_log('Websocket new connection before read header');
            if(!($header = socket_read($new_client_socket, 65536))){
                $error_code = socket_last_error();
                $error_msg = socket_strerror($error_code);

                error_log('Could not read on new_client_socket: ['.$error_code.'] '.$error_msg.'\n');
            }

            error_log('Websocket new connection after read header => '.json_encode($header));

            $datas = json_decode($header);

            if ((isset($datas->type) && $datas->type == "server") || (isset($datas->type) && $datas->type == "cec")) { 
                $newDatas = json_decode($datas->data);
                $searchIndex = strtolower($newDatas->ip_address) . '-' . strtolower($newDatas->mac_address);
                unset($datas->type);
                $response = mask(json_encode($datas));

                checkSocketAndSendMessage($clientSockets, $socketLists, $searchIndex, $response);
            }else{
                performHandshaking($header, $new_client_socket, $host, $port);
            }

            /**
            * make room for new socket
            **/
            $found_socket = array_search($socket, readSockets);
            unset($readSockets[$found_socket]);
        }else{
            $error_code = socket_last_error();
            $error_msg = socket_strerror($error_code);
            // die();
        }
    }


    foreach ($readSockets as $readSocket) {
        $buf = @socket_read($readSocket, 65536, PHP_NORMAL_READ);

        if(strlen($buf) < 1){
            $socket_index = array_search($readSocket, $clientSockets);

            $socket_list_index = '';
            foreach($socketLists as $key => $socketList){
                if($readSocket == $socketList['index']){
                    $socket_list_index = $key;
                }
            }

            if(!socket_getpeername($readSocket, $ip)){
                $error_code = socket_last_error();
                $error_msg = socket_strerror($error_code);

                error_log('error disconnect socket_getpeername: ['.$error_code.'] '.$error_msg.'\n');
            }

            /**
            * Added to try cater
            * CLOSE_WAIT problem
            **/
            $linger     = array ('l_linger' => 0, 'l_onoff' => 1);
            if(!socket_set_option($clientSockets[$socket_index], SOL_SOCKET, SO_LINGER, $linger)){
                $error_code = socket_last_error();
                $error_msg = socket_strerror($error_code);

                error_log('error disconnect socket_set_option: ['.$error_code.'] '.$error_msg.'\n');
            }

            if(!socket_close($clientSockets[$socket_index])){
                $error_code = socket_last_error();
                $error_msg = socket_strerror($error_code);

                error_log('error disconnect socket_close: ['.$error_code.'] '.$error_msg.'\n');
            }
            unset($clientSockets[$socket_index]);
            if(isset($socketLists[$socket_list_index])){
                unset($socketLists[$socket_list_index]);
            }
        }
    }
}
设置时间限制(0);
if(!($socket=socket\u create(AF\u INET,SOCK\u STREAM,0))){
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
模具();
}
if(!socket\u set\u选项($socket,SOL\u socket,SO\u REUSEADDR,1)){
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
模具();
}
if(!socket_bind($socket,0,$port)){
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
模具();
}
如果(!socket_listen($socket))
{
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
模具();
}
/**
*客户端套接字数组
**/
$clientSockets=数组($socket);
$socketlist=array();
$write=null;
$except=null;
$header=array();
/**
*开始无休止的循环,这样我们的脚本就不会停止
**/
while(true){
/**
*要读取的套接字数组
*!从clientSockets数组获取
**/
$readSockets=$clientSockets;
/**
*现在调用select-阻塞调用
**/
if(socket_select($readSockets,$write,$except,0,10)==false)
{
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
错误日志('无法侦听套接字:['.$error\u code.].$error\u msg.\n');
}
if(在数组中($socket,$readSockets)){
/**
*接受新的客户端套接字
**/
if($new\u client\u socket=socket\u accept($socket))!==false){
错误日志('Websocket有新连接');
/**
*将新客户端套接字添加到客户端套接字阵列
**/
$clientSockets[]=$new\u client\u socket;
/**
*读取套接字缓冲区(65536、65536)发送的数据
**/
错误日志('Websocket读取头之前新建连接');
如果(!($header=socket\u read($new\u client\u socket,65536))){
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
错误日志('无法读取新的\u客户端\u套接字:['.$error\u code.].$error\u msg.\n');
}
错误日志('Websocket读取头后新连接=>'。json_编码($header));
$datas=json_decode($header);
如果((isset($datas->type)&&&$datas->type==“server”)| |(isset($datas->type)&&&$datas->type==“cec”){
$newDatas=json_decode($datas->data);
$searchIndex=strtolower($newDatas->ip_地址)。'-'.strtolower($newDatas->mac_地址);
未设置($datas->type);
$response=mask(json_encode($datas));
checkSocketAndSendMessage($clientSockets、$SocketList、$searchIndex、$response);
}否则{
PerformHandshacking($header、$new\u client\u socket、$host、$port);
}
/**
*为新插座腾出空间
**/
$found\u socket=array\u search($socket,readSockets);
未设置($readSockets[$found_socket]);
}否则{
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
//模具();
}
}
foreach($readSockets作为$readSocket){
$buf=@socket\u read($readSocket,65536,PHP\u NORMAL\u read);
如果(斯特伦($buf)<1){
$socket\u index=array\u search($readSocket,$clientSockets);
$socket\u list\u index='';
foreach($socketList作为$key=>$socketList){
如果($readSocket==$socketList['index'])){
$socket\u list\u index=$key;
}
}
如果(!socket_getpeername($readSocket,$ip)){
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
错误日志('error disconnect socket\u getpeername:['.$error\u code.].$error\u msg.\n');
}
/**
*添加以尝试迎合
*关闭等待问题
**/
$linger=array('l_linger'=>0,'l_onoff'=>1);
if(!socket\u set\u选项($clientSockets[$socket\u index],SOL\u socket,SO\u LINGER,$LINGER)){
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
错误日志('error disconnect socket\u set_选项:['.$error\u code.].$error\u msg.\n');
}
如果(!socket\u close($clientSockets[$socket\u index])){
$error\u code=socket\u last\u error();
$error\u msg=socket\u strerror($error\u code);
错误日志('error disconnect socket\u close:['.$error\u code.].$error\u msg.\n');
}
未设置($clientSockets[$socket_index]);
if(isset($socketlist[$socket\u list\u index])){
取消设置($socketlist[$socket_list_index]);
}
}
}
}
它总是在
error_log('Websocket-newconnection-beforead-header')处停止

我希望如果有错误,它会显示在这里
error\u log('cannotreadonnew\u client\u socket:['.$error\u code.].$error\u msg.\n')

但没有出现错误。它只是卡在那里了

如果我尝试连接到websocket,我会在服务器中选中
netstat-tcp
,它会显示state
estured

现状:-
TCP00 roomie-devel:cslistener internettl.org:51715-17556/php

请有人帮助我,linux中有任何设置需要更改吗

我尝试关闭套接字,但它返回错误:-
错误断开套接字\u关闭:[104]对等方重置连接\n

有一个