Установите тайм-аут для socket_read

Мне было интересно, как установить тайм-аут на вызове socket_read? При первом вызове socket_read он ждет, пока данные не будут отправлены, и если в течение 5 секунд данные не будут отправлены, я хочу отключить соединение. Любая помощь? Я уже пробовал SO_RCVTIMEO, но безуспешно.

Я создаю сокет с socket_create() и слушаю его на предмет подключений, затем при подключении я прослушиваю данные, а затем что-то делаю с ними. Когда истечет время ожидания, я хочу запустить socket_shutdown(), а затем socket_close().

Обратите внимание, что Windows Sockets API не работает с таймаутом менее 500 мс. Вы можете установить тайм-аут на гораздо меньшее время, но пока вы будете на платформе Windows, вы должны знать, что это, вероятно, не будет работать так, как вы хотели. Ссылка: microsoft.com/mspress/books/WW/sampchap/4287d.aspx.

excanoe 13.07.2012 22:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
17
1
31 225
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы пробовали socket_set_option с SO_RCVTIMEO

Значение тайм-аута для операций ввода.

Я пытался! Я думаю, что нашел решение с socket_listen и ручным тайм-аутом с time () + 2 и некоторое время.

James Hartig 23.12.2008 22:09

Блестяще! Это решило проблему для меня. Теперь у меня есть socket_read(), срок службы которого истек.

Jeremy Visser 04.01.2010 11:24
Ответ принят как подходящий

Я сделал socket_listen, а затем вручную установил тайм-аут с time () + 2 и цикл while с неблокирующим набором и socket_read () внутри. Кажется, работает нормально. Есть альтернативы?

ОБНОВЛЕНИЕ: я обнаружил, что установка сокета как неблокирующего, а затем использование socket_listen обеспечивает необходимый мне тайм-аут.

Ооо, вы принимаете соединения через сокеты с PHP. Это немного другое. us3.php.net/manual/en/function.socket-select.php Select вернет сокеты, если есть что-то доступное для чтения, в противном случае истечет время ожидания с указанным вами таймаутом.

Steven Behnke 23.12.2008 22:49

это устанавливает тайм-аут сокета 5 секунд.

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));

после некоторого тестирования - похоже, что это время жизни всего сокета, а не только socket_read

roocell 16.12.2011 03:18

Интересное наблюдение: если вы используете PHP_NORMAL_READ вместо PHP_BINARY_READ (по умолчанию) в качестве третьего аргумента функции socket_read (), он будет игнорировать тайм-аут, установленный с помощью socket_set_option (), и будет блокироваться на неопределенный срок, пока что-то не будет отправлено ... (наблюдается в PHP 5.5.9. )

2072 05.03.2014 03:00

Еще одно интересное наблюдение: это не сработает, если вы удалите `usec` из массива.

Dushyant Bangal 13.07.2018 08:15

не работает надежно, ему нельзя доверять. У меня много случаев, когда он зависает на несколько минут, даже если настроен тайм-аут в несколько миллисекунд. Может зависеть от флагов TCP

John 09.02.2019 11:31

Установка этого параметра на основном $socket, созданном с помощью socket_create(), повлияет как на тайм-аут socket_accept(), так и на тайм-аут socket_read(). Чтобы повлиять только на тайм-аут socket_read (), установите его для имени второго сокета, созданного с помощью $socket_name = socket_accept().

adrianTNT 01.08.2020 15:41
$read_socket = socket_select($read, $write  = NULL, $except = NULL, 10); // 10 - Timeout
if ($read_socket === FALSE)
    $this->End();
elseif ($read_socket === 0)
    return FALSE;

$pdu_ = socket_read($this->session, 102400);
if ($read_socket && !strlen($pdu_))
    $this->End();

Объяснение было бы полезно.

tim.rohrer 03.01.2018 19:09

Другие вопросы по теме