Приветствую. Есть echo ws сервер, возвращает полученные сообщения обратно клиенту. Соответственно реагирует только на новые подключения и полученные сообщения. Нужно чтобы каждые 5 секунд сервер отправлял сообщение всем подключенным клиентам. Вопрос в том, как сделать выполнение блока с кодом каждые n секунд, чтобы сервер продолжал ловить новые подключения в промежутках. Помогите пожалуйста( Вот код: Код (Text): error_reporting(E_ALL); //Выводим все ошибки и предупреждения set_time_limit(180); //Время выполнения скрипта ограничено 180 секундами ob_implicit_flush(); //Включаем вывод без буферизации $socket = stream_socket_server("tcp://127.0.0.1:8889", $errno, $errstr); if (!$socket) { echo "socket unavailable<br />"; die($errstr. "(" .$errno. ")\n"); } $connects = array(); while (true) { echo "main while...<br />"; //формируем массив прослушиваемых сокетов: $read = $connects; $read []= $socket; $write = $except = null; if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута) break; } if (in_array($socket, $read)) {//есть новое соединение то обязательно делаем handshake //принимаем новое соединение и производим рукопожатие: if (($connect = stream_socket_accept($socket, -1)) && $info = handshake($connect)) { echo "new connection...<br />"; echo "connect=".$connect.", info=".$info."<br />OK<br />"; //echo "info<br />"; //var_dump($info); $connects[] = $connect;//добавляем его в список необходимых для обработки onOpen($connect, $info);//вызываем пользовательский сценарий } unset($read[ array_search($socket, $read) ]); } foreach($read as $connect) {//обрабатываем все соединения $data = fread($connect, 100000); if (!$data) { //соединение было закрыто echo "connection closed...<br />"; fclose($connect); unset($connects[ array_search($connect, $connects) ]); onClose($connect);//вызываем пользовательский сценарий continue; } onMessage($connect, $data);//вызываем пользовательский сценарий } } fclose($socket); // дальше идут функции
ну так в начале или в конце while проверяй прошло ли 5 секунд с прошлого вызова и если да, то отправляй сообщение всем. ещё готовое можно использовать: https://github.com/reactphp/event-loop addPeriodicTimer
а не вариант того, что клиент пользователя дает сигнал через js серверу об онлайне, нет... надо чтоб сервер насиловал клиентов