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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Websocket некорректное отключение клиента

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Как проверить что клиент прервал связь?
arbuzmaster
Отправлено: 01 Мая, 2017 - 21:04:23
Post Id


Новичок


Покинул форум
Сообщений всего: 23
Дата рег-ции: Май 2017  


Помог: 0 раз(а)




Подскажите пожалуйста, как произвести проверку на отключение клиента от 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.     }

Он рабочий, но есть одна проблема, если клиент отключается некорректно - т.е. например прервалось соединение с интернетом, то скрипт через некоторый промежуток времени начинает жутко тормозить, до того момента пока тот же самый клиент вновь не наладит связь с сервером! Как сюда внедрить проверку на то, что клиент отключился без посылки команды на отключение? Если закрыть вкладку браузера, то отключение клиента проходит корректно и проблема отсутствует!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB