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






Вы пробовали socket_set_option с SO_RCVTIMEO
Значение тайм-аута для операций ввода.
Я пытался! Я думаю, что нашел решение с socket_listen и ручным тайм-аутом с time () + 2 и некоторое время.
Блестяще! Это решило проблему для меня. Теперь у меня есть socket_read(), срок службы которого истек.
Я сделал socket_listen, а затем вручную установил тайм-аут с time () + 2 и цикл while с неблокирующим набором и socket_read () внутри. Кажется, работает нормально. Есть альтернативы?
ОБНОВЛЕНИЕ: я обнаружил, что установка сокета как неблокирующего, а затем использование socket_listen обеспечивает необходимый мне тайм-аут.
Ооо, вы принимаете соединения через сокеты с PHP. Это немного другое. us3.php.net/manual/en/function.socket-select.php Select вернет сокеты, если есть что-то доступное для чтения, в противном случае истечет время ожидания с указанным вами таймаутом.
это устанавливает тайм-аут сокета 5 секунд.
socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
после некоторого тестирования - похоже, что это время жизни всего сокета, а не только socket_read
Интересное наблюдение: если вы используете PHP_NORMAL_READ вместо PHP_BINARY_READ (по умолчанию) в качестве третьего аргумента функции socket_read (), он будет игнорировать тайм-аут, установленный с помощью socket_set_option (), и будет блокироваться на неопределенный срок, пока что-то не будет отправлено ... (наблюдается в PHP 5.5.9. )
Еще одно интересное наблюдение: это не сработает, если вы удалите `usec` из массива.
не работает надежно, ему нельзя доверять. У меня много случаев, когда он зависает на несколько минут, даже если настроен тайм-аут в несколько миллисекунд. Может зависеть от флагов TCP
Установка этого параметра на основном $socket, созданном с помощью socket_create(), повлияет как на тайм-аут socket_accept(), так и на тайм-аут socket_read(). Чтобы повлиять только на тайм-аут socket_read (), установите его для имени второго сокета, созданного с помощью $socket_name = socket_accept().
$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();
Объяснение было бы полезно.
Обратите внимание, что Windows Sockets API не работает с таймаутом менее 500 мс. Вы можете установить тайм-аут на гораздо меньшее время, но пока вы будете на платформе Windows, вы должны знать, что это, вероятно, не будет работать так, как вы хотели. Ссылка: microsoft.com/mspress/books/WW/sampchap/4287d.aspx.