Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Websocket некорректное отключение клиента
Форумы портала PHP.SU » » Вопросы новичков » Websocket некорректное отключение клиента

Страниц (1): [1]
 

1. arbuzmaster - 01 Мая, 2017 - 21:04:23 - перейти к сообщению
Подскажите пожалуйста, как произвести проверку на отключение клиента от WebSocket сервера. Есть вот такой код:
PHP:
скопировать код в буфер обмена
  1. function startWebsocketServer()
  2.     {
  3.        
  4.         $socket = stream_socket_server("tcp://0.0.0.0:8080", $errno, $errstr);
  5.  
  6.         if (!$socket)
  7.         {
  8.             die("$errstr ($errno)\n");
  9.         }
  10.  
  11.         $connects = array();
  12.         while (true)
  13.         {
  14.             //формируем массив прослушиваемых сокетов:
  15.             $read = $connects;
  16.             $read []= $socket;
  17.             $write = $except = null;
  18.  
  19.             if (!stream_select($read, $write, $except, null))
  20.             {//ожидаем сокеты доступные для чтения (без таймаута)
  21.                
  22.                         break;
  23.                
  24.                    
  25.             }
  26.            
  27.             if (in_array($socket, $read))
  28.             {
  29.                
  30.                             //есть новое соединение
  31.                             //принимаем новое соединение и производим рукопожатие:
  32.                             if (($connect = stream_socket_accept($socket, -1)) && $info = handshake($connect))
  33.                             {
  34.                                  
  35.                                             $connects[] = $connect;//добавляем его в список необходимых для обработки
  36.                    
  37.                                              onOpen($connect, $info);//вызываем пользовательский сценарий
  38.                                      
  39.                             }
  40.                             unset($read[ array_search($socket, $read) ]);
  41.                  
  42.              }
  43.            
  44.             foreach($read as $connect)
  45.             {//обрабатываем все соединения
  46.                 $data = fread($connect, 100000);
  47.                
  48.                 if (!$data)
  49.                 { //соединение было закрыто
  50.                     fclose($connect);
  51.                     unset($connects[ array_search($connect, $connects) ]);
  52.                     onClose($connect);//вызываем пользовательский сценарий
  53.                     continue;
  54.                 }
  55.                
  56.                /*
  57.                 * onMessage($connects, $data) для отправки каждому пользователю своего сообщения
  58.                 * заменить $connects на $connect и убрать цикл в функции onMessage
  59.                 */
  60.                
  61.                onMessage($connects, $data);//вызываем пользовательский сценарий, для отправки одном
  62.             }
  63.          
  64.            
  65.         }
  66.  
  67.         fclose($socket);
  68.        
  69.        
  70.        
  71.        
  72.     }

Он рабочий, но есть одна проблема, если клиент отключается некорректно - т.е. например прервалось соединение с интернетом, то скрипт через некоторый промежуток времени начинает жутко тормозить, до того момента пока тот же самый клиент вновь не наладит связь с сервером! Как сюда внедрить проверку на то, что клиент отключился без посылки команды на отключение? Если закрыть вкладку браузера, то отключение клиента проходит корректно и проблема отсутствует!

 

Powered by ExBB FM 1.0 RC1