Замечание:
Когда stream_select() возвращается, массивы read, write и except изменяются для того, чтобы указать, какие потоковые ресурсы на самом деле изменили статус. Исходные ключи массивов (array) сохраняются.
in_array
не работает: if (in_array($socket, $read)) {//есть новое соединение
//принимаем новое соединение и производим рукопожатие:
writeToLog('Рукопожопие...');
writeToLog(print_r($read.'__'.$socket.'__'.in_array($socket, $read)));
выдаёт Array__Resource id #8__1
, то есть сам in_array со значением 1, но if () {}
не выполняется. Поэтому и ищу, почему сокета нет в массиве на данном этапе?$read[0]
тоже равен NULL
$connects = array($socket);
$read = $connects;
$socket = stream_socket_server($transport . '://' . $host . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $ssl_context);
NULL
, почему? $ssl_context = stream_context_create($ssl);
$socket = stream_socket_server($transport . '://' . $host . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $ssl_context);
if (!$socket) {
writeToLog("$errstr ($errno)\n", 'Ошибка соединения');
die("$errstr ($errno)\n");
}
file_put_contents(__DIR__."/222", '------');
$connects = array($socket);
$write = $except = null;
$i = 0;
while (true) {
//формируем массив прослушиваемых сокетов:
$read = $connects;
$i++;
// unset($_SESSION['vd']);
// writeToLog($read.'__'.$socket.'__'.in_array($socket, $read));
if ($i > 5) {
writeToLog(serialize($connects));
fclose($socket);
die;
}
if (stream_select($read, $write, $except, 0) < 1) //ожидаем сокеты доступные для чтения
continue;
writeToLog($read);
if (in_array($socket, $read)) {//есть новое соединение
//принимаем новое соединение и производим рукопожатие:
writeToLog('Рукопожопие...');
if (($connect = stream_socket_accept($socket, 1)) && $info = handshake($connect)) {
$connects[] = $connect;//добавляем его в список необходимых для обработки
writeToLog('Рукопожопие2...');
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($connect, $data);//вызываем пользовательский сценарий
}
}
serialize() обрабатывает все типы, кроме resource и некоторых типов object
in_array($socket, $read)
if (in_array($socket, $read)) {}
viewBox="0 0 24 24"
для SVG даёт нужный результат... Но это как-то не логично и непонятно почему работает именно так. И получилась новая система координат внутри другой системы координат... Очень костыльно.
Но я плавно снижал с 200000 рекомендуемых, на ситуацию повлияло положительно, так как для пяти опросов нагрузки особо нет, а скорость выполнения мгновенная. Для отладки пока так держу, но на всякий случай секунду добавил.