function startWebsocketServer()
{
$socket = stream_socket_server("tcp://0.0.0.0:8080", $errno, $errstr);
if (!$socket)
{
die("$errstr ($errno)\n");
}
$connects = array();
while (true)
{
//формируем массив прослушиваемых сокетов:
$read = $connects;
$read []= $socket;
$write = $except = null;
if (!stream_select($read, $write, $except, null))
{//ожидаем сокеты доступные для чтения (без таймаута)
break;
}
if (in_array($socket, $read))
{
//есть новое соединение
//принимаем новое соединение и производим рукопожатие:
if (($connect = stream_socket_accept($socket, -1)) && $info = handshake($connect))
{
$connects[] = $connect;//добавляем его в список необходимых для обработки
onOpen($connect, $info);//вызываем пользовательский сценарий
}
unset($read[ array_search($socket, $read) ]);
}
foreach($read as $connect)
{//обрабатываем все соединения
$data = fread($connect, 100000);
if (!$data)
{ //соединение было закрыто
fclose($connect);
unset($connects[ array_search($connect, $connects) ]);
onClose($connect);//вызываем пользовательский сценарий
continue;
}
/*
* onMessage($connects, $data) для отправки каждому пользователю своего сообщения
* заменить $connects на $connect и убрать цикл в функции onMessage
*/
onMessage($connects, $data);//вызываем пользовательский сценарий, для отправки одном
}
}
fclose($socket);
}
Он рабочий, но есть одна проблема, если клиент отключается некорректно - т.е. например прервалось соединение с интернетом, то скрипт через некоторый промежуток времени начинает жутко тормозить, до того момента пока тот же самый клиент вновь не наладит связь с сервером! Как сюда внедрить проверку на то, что клиент отключился без посылки команды на отключение? Если закрыть вкладку браузера, то отключение клиента проходит корректно и проблема отсутствует!
UDP: Было замечено, что отсутствующее соединение держится в течении 20 минут, после чего закрывается автоматически!
_____________
Мой первый сайтик
Посмотри на свой XBMC под другим углом