Intereting Posts
Вычитание дней, месяцев или лет с даты с использованием php Неизвестный модификатор '(' при использовании preg_match () с выражением REGEX Загрузка файла с использованием zend framework 1.7.4 Uncaught PHP Exception Doctrine \ ORM \ ORMException: "Неизвестное имя пространства имен псевдонима" AppBundle "." Ошибка при добавлении кода через vqmod Можете ли вы присвоить значения константам с знаком равенства после использования, определенных в php? Кнопка «Назад» повторно отправляет данные формы ($ _POST) Определите, является ли строка допустимым географическим местоположением Какие проблемы с сериализацией POST ссылаются на пример IP-адреса PayPal PHP? Как остановить конфликтующие две библиотеки jquery друг с другом? Как пропустить эти json-декодированные данные в PHP? Как увеличить ограничение памяти для PHP более чем на 2 ГБ? phpMyAdmin Доступ запрещен организовать отображение данных из таблицы Как получить второе значение в раскрывающемся списке на основе выбранного в первом раскрывающемся списке

Как установить тайм-аут для fread при доступе к соке?

Ниже приведен мой код. Я хочу, чтобы fread мог вернуться, когда нет данных для чтения через несколько секунд. Я вызвал stream_set_timeout. Но это не сработает. И я также назвал stream_get_meta_data. Это еще не дает моей потребности. Я подключаю chat.facebook.com.

$fp = fsockopen($server, 8888, $errno, $errstr); stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); fwrite($fp, $xml); stream_set_timeout($fp, 5); $str = fread($fp,8192);//This code will hang when there don't have data to read. 

Если вы прочитали руководство для stream_set_timeout() вы бы знали, что единственное, что stream_set_timeout() делает в случае таймаута, это установка ключа timed_out из массива, возвращаемого stream_get_meta_data() в true.

 stream_set_timeout($fp, 5); // set stream into non-blocking mode stream_set_blocking($fp, false); $break_counter = 0; $result = ''; $info = stream_get_meta_data($fp); while (!$info['timed_out'] && !feof($fp)) { $str = @fgets($fp, 1160); if ($str) { $result .= $str; } else { $break_counter += 1; if ($break_counter > 100) { break; } // 10000*100 microseconds gives you one second usleep(10000); } $info = stream_get_meta_data($fp); }