За последние 24 часа нас посетил 16581 программист и 1643 робота. Сейчас ищут 1274 программиста ...

Вебсокет сервер на php, нужно немного переделать.

Тема в разделе "Сделайте за меня", создана пользователем webgelo, 23 янв 2015.

  1. webgelo

    webgelo Новичок

    С нами с:
    20 янв 2015
    Сообщения:
    3
    Симпатии:
    0
    Приветствую.
    Есть echo ws сервер, возвращает полученные сообщения обратно клиенту. Соответственно реагирует только на новые подключения и полученные сообщения.

    Нужно чтобы каждые 5 секунд сервер отправлял сообщение всем подключенным клиентам. Вопрос в том, как сделать выполнение блока с кодом каждые n секунд, чтобы сервер продолжал ловить новые подключения в промежутках. Помогите пожалуйста(

    Вот код:
    Код (Text):
    1.  
    2. error_reporting(E_ALL); //Выводим все ошибки и предупреждения
    3. set_time_limit(180);    //Время выполнения скрипта ограничено 180 секундами
    4. ob_implicit_flush();    //Включаем вывод без буферизации
    5.  
    6. $socket = stream_socket_server("tcp://127.0.0.1:8889", $errno, $errstr);
    7.  
    8. if (!$socket) {
    9.     echo "socket unavailable<br />";
    10.     die($errstr. "(" .$errno. ")\n");
    11. }
    12.  
    13. $connects = array();
    14. while (true) {
    15.     echo "main while...<br />";
    16.     //формируем массив прослушиваемых сокетов:
    17.     $read = $connects;
    18.     $read []= $socket;
    19.     $write = $except = null;
    20.  
    21.     if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута)
    22.         break;
    23.     }
    24.  
    25.     if (in_array($socket, $read)) {//есть новое соединение то обязательно делаем handshake
    26.         //принимаем новое соединение и производим рукопожатие:
    27.         if (($connect = stream_socket_accept($socket, -1)) && $info = handshake($connect)) {
    28.             echo "new connection...<br />";            
    29.             echo "connect=".$connect.", info=".$info."<br />OK<br />";          
    30.             //echo "info<br />";    
    31.             //var_dump($info);
    32.  
    33.             $connects[] = $connect;//добавляем его в список необходимых для обработки
    34.             onOpen($connect, $info);//вызываем пользовательский сценарий
    35.         }
    36.         unset($read[ array_search($socket, $read) ]);
    37.     }
    38.  
    39.     foreach($read as $connect) {//обрабатываем все соединения
    40.         $data = fread($connect, 100000);
    41.  
    42.         if (!$data) { //соединение было закрыто
    43.             echo "connection closed...<br />";    
    44.             fclose($connect);
    45.             unset($connects[ array_search($connect, $connects) ]);
    46.             onClose($connect);//вызываем пользовательский сценарий
    47.             continue;
    48.         }
    49.  
    50.         onMessage($connect, $data);//вызываем пользовательский сценарий
    51.     }
    52.  
    53. }
    54.  
    55. fclose($socket);
    56.  
    57. // дальше идут функции
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ну так в начале или в конце while проверяй прошло ли 5 секунд с прошлого вызова и если да, то отправляй сообщение всем.

    ещё готовое можно использовать:

    https://github.com/reactphp/event-loop
    addPeriodicTimer
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
    а не вариант того, что клиент пользователя дает сигнал через js серверу об онлайне, нет... надо чтоб сервер насиловал клиентов