Как утановить ограничение времени на fsockopen

127
04 декабря 2020, 21:30

Проблема такая: скрипт стучится к неправильному IP слишком долго (>30s).

private function connect($ip, $port) {
    $connection = @fsockopen("udp://" . $ip, $port, $errno, $errstr, 0.05);
    stream_set_timeout(5);
    if(!$connection) return false;
    stream_set_blocking($connection, true);
    return $connection;
}
private function query($connection, $query, $append = "") {
    if(!$connection) return false;
    $command = pack("c*", 0xFE, 0xFD, $query, 0x00, 0x00, 0x00, 0x01) . $append;
    $length = strlen($command);
    fwrite($connection, $command, $length);
    $data = fread($connection, 4096);
    return substr($data, 5);
}
Answer 1

Вас варнинг вида

stream_set_timeout() expects at least 2 parameters, 1 given

совершенно не смущает? stream_set_timeout требуется ставить на ресурс, это не глобальная штука и у этой функции 2 обязательных аргумента. Соответственно вы запрашиваете таймаут на fsockopen последним параметром - но это UDP, там нет установки соединения вовсе. Поэтому не уверен, может ли fsockopen по UDP вообще отвалиться по таймауту. Похожим образом сложно таймаут ждать от fwrite. UDP никак не подтвердит, что пакет получен. Можно послать пакет и всё, больше ждать нечего. Но fwrite с сетью всё-таки работает, так что тут таймаут ещё может быть при отправке. Ждёт же скрипт на fread. И поскольку stream_set_timeout был вызван некорректно - то таймаут используется дефолтный.

Вот если корректно запросить stream_set_timeout

stream_set_timeout($connection, 5);

То последующий fread будет учитывать этот таймаут и прервётся по прошествии этого времени.

READ ALSO
SMS шлюз для верификации номера телефона

SMS шлюз для верификации номера телефона

Есть форма отправки с полями имени фамилией email и телефонаНужно реализовать проверку номера телефона с помощью смс кода

120
Curl загрузка файла не зная расширения

Curl загрузка файла не зная расширения

Использую curl Не понимаю, как сохранять файл не зная его расширения?! Тк

105
логический оператор OR в blade laravel 5.8

логический оператор OR в blade laravel 5.8

использую laravel версии 58 и в шаблоне blade хочу использовать такую конструкцию {{$student->name OR ""}} судя по некоторым источникам должно работать,...

141
Проблемы с запуском локального сервера

Проблемы с запуском локального сервера

Проблема состоит в запуске локального сервера, будь то OpenServer, то XAMPPОшибка, по совместительству моя проблема, состоит в занятом порте

110