Задать вопрос
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    Антон Шаманов, ну сериализация дело второе. $socket то выводит нормально, а если его добавить в массив $read, а потом попробовать найти в этом массиве, то после 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) равен единице.
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    Убрал я уже сериализацию из вопроса, в предыдущем ответе уже вывели цитату, что ресурсы не сериализуются, так же пришли к выводу, что stream_selectпереписывает значения, вопрос, почему они нулевые.
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    galaxy,
    Внимание
    Использование значения времени ожидания 0 позволяет вам мгновенно опросить статус потоков, однако ПЛОХАЯ идея использовать значение времени ожидания 0 в цикле, так как это заставит ваш скрипт потреблять слишком много процессорного времени.


    Но я плавно снижал с 200000 рекомендуемых, на ситуацию повлияло положительно, так как для пяти опросов нагрузки особо нет, а скорость выполнения мгновенная. Для отладки пока так держу, но на всякий случай секунду добавил.
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    galaxy, сделал так
    $select = stream_select($read, $write, $except, 0);
        if ($select < 1) //ожидаем сокеты доступные для чтения
        continue;
    получилось так: $select = i:0;
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    galaxy, Так и есть скорее всего $read то пустой.
    Замечание:

    Когда stream_select() возвращается, массивы read, write и except изменяются для того, чтобы указать, какие потоковые ресурсы на самом деле изменили статус. Исходные ключи массивов (array) сохраняются.


    Вопрос просто, почему?
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    galaxy, то есть, событие правильно работает? А соединение происходит с сервером, и сервер молчит?
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    galaxy, Этот момент тоже менял, было
    if (!stream_select($read, $write, $except, 5)) {//ожидаем сокеты доступные для чтения (без таймаута)
            break;
        }


    Доходит 5 раз до
    if (in_array($socket, $read)) {//есть новое соединение
            //принимаем новое соединение и производим рукопожатие:


    и всё...
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    galaxy, Не всё так просто. Здесь 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
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    FanatPHP, не пойму почему он NULL, я ему присваиваю:
    $connects = array($socket);
    $read = $connects;


    А для $connects присваиваю сокет
    $socket = stream_socket_server($transport . '://' . $host . ':' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $ssl_context);


    А на выходе NULL, почему?
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    FanatPHP, В массиве ищу сокет, но в функции он не работает, хотя
    writeToLog($read.'__'.$socket.'__'.in_array($socket, $read));
    Показывает Array__Resource id #8__1
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    galaxy,

    $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);//вызываем пользовательский сценарий
        }
    }
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    FanatPHP, Не могу разобраться, почему сравнение нормально не работает.
  • Почему сокет не сохраняется в массиве?

    @aspirantes Автор вопроса
    Благодарю за ответ.

    Что-то типа этого я предполагал
    serialize() обрабатывает все типы, кроме resource и некоторых типов object


    Но, при поиске этого ресурса почему-то выдаёт "1":
    in_array($socket, $read)

    А при использовании в функции:
    if (in_array($socket, $read)) {}

    Функция не работает, собственно из-за чего и начал искать содержимое переменных.

    Ещё интересно, $socket тип resource, а $read[0] - NULL
  • Как выровнять иконки в шапке сайта?

    @aspirantes
    добавь flex внутри header__links, и ровняй.
  • Что лучше выбрать MariaDB or Mysql?

    @aspirantes
    FanatPHP, я привёл свою точку зрения, и указал, по какой причине отказался от второго в счёт первого, в вашем комментарии недочётов больше, так как в моём я не утверждаю ничего не известного мне, в отличие от вашего "косметическое...". Написал как есть, хоть и считаю вас, лучшим на данном проекте, и спорить не решусь.
  • Что лучше выбрать MariaDB or Mysql?

    @aspirantes
    Отказался от MariaDB из-за необходимых костылей с рут правами... Где-то читал, что у Яндекса есть очень быстрая дата база. А так из-за того, что пока лень вникать пользуюсь Mysqli (не MySQL), хотя в чём разница не знаю. Удачи.
  • Не плавная анимация на смартфонах, как можно доработать, есть ли способ ограничить частоту кадров для анимаций?

    @aspirantes Автор вопроса
    Сергей delphinpro, да вроде должен вывозить простую анимацию квалком 630, да и в играх проблем не было. Просто, как буд-то аппаратное ускорение не подключается, хотя хаком в таких ситуациях используют translate3d
  • Почему иногда проскальзывает значение повторно?

    @aspirantes Автор вопроса
    Вопрос немного другой. Здесь рекурсия стоит на повтор, при наличии имеющегося элемента в пополняемой таблице. Но по какой-то причине проскальзывают повторы.
  • Почему иногда проскальзывает значение повторно?

    @aspirantes Автор вопроса
    Чем "!" Хуже? Вместо рекурсии лучше while использовать? Тоже не знаю, в чём разница?
  • Как подогнать блок SVG к блоку USE по размерам?

    @aspirantes Автор вопроса
    Brasileiro, Не знаю почему, но удалив размер у DIV, viewBox="0 0 24 24" для SVG даёт нужный результат... Но это как-то не логично и непонятно почему работает именно так. И получилась новая система координат внутри другой системы координат... Очень костыльно.