$socket = stream_socket_server($transport . '://' . $host . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $ssl_context);
Resource id #8
$connects = array($socket);
a:1:{i:0;i:0;}
serialize() обрабатывает все типы, кроме resource и некоторых типов object
serialize() обрабатывает все типы, кроме resource и некоторых типов object
in_array($socket, $read)
if (in_array($socket, $read)) {}
$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);//вызываем пользовательский сценарий
}
}
writeToLog($read.'__'.$socket.'__'.in_array($socket, $read));
Показывает Array__Resource id #8__1
$connects = array($socket);
$read = $connects;
$socket = stream_socket_server($transport . '://' . $host . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $ssl_context);
NULL
, почему? В массиве ищу сокет, но в функции он не работает, хотяв какой функции? Где в вашем коде функция?
не пойму почему он NULL, я ему присваиваю:
unset($read[array_search($socket, $read)]);
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
if (stream_select($read, $write, $except, 0) < 1) //ожидаем сокеты доступные для чтения
continue;
Параметры seconds и microseconds вместе формируют параметр timeout, seconds указывает число секунд, а microseconds - число микросекунд. Параметр timeout - это верхняя граница времени, которое функция stream_select() будет ожидать до возвращения. Если параметры seconds и microseconds оба установлены в 0, то функция stream_select() не будет ожидать данных - вместо этого она вернётся немедленно, указывая текущий статус потоков.
if () {}
не выполняется? Уверены, что до него дело доходит?if (!stream_select($read, $write, $except, 5)) {//ожидаем сокеты доступные для чтения (без таймаута)
break;
}
if (in_array($socket, $read)) {//есть новое соединение
//принимаем новое соединение и производим рукопожатие:
Замечание:
Когда stream_select() возвращается, массивы read, write и except изменяются для того, чтобы указать, какие потоковые ресурсы на самом деле изменили статус. Исходные ключи массивов (array) сохраняются.
$select = stream_select($read, $write, $except, 0);
if ($select < 1) //ожидаем сокеты доступные для чтения
continue;
получилось так: $select = i:0;
Внимание
Использование значения времени ожидания 0 позволяет вам мгновенно опросить статус потоков, однако ПЛОХАЯ идея использовать значение времени ожидания 0 в цикле, так как это заставит ваш скрипт потреблять слишком много процессорного времени.
stream_select
обнуляет массив. А ноль возвращает, потому что ответа от сервера нет. stream_select
его там нет. А сам stream_select
равен нулю.$read[0]
начал выдавать такое же значение, что и $socket
.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)]);
}
in_array($socket, $read)
равен единице. stream_select
массив обнуляется...