Определить, не разорвано ли соединение _считыванием_ из сокета HTTP соединения.

camka

не самка
Определить, не разорвано ли соединение _считыванием_ из сокета HTTP соединения.

Задача - держать достаточно продолжительное соединение с клиентом, и, вовремя отреагировать на разрыв этого соединения на стороне сервера.

На данный момент решение работает на проверке состояния соединения ( connection_status() ). Поскульку отреагировать на разрыв соединения следует как можно раньше, то приходится писать в поток вывода по одному байту каждый раз, когда надо проверить соединение, так как статус в этом случае определяется именно по результату функции _записи_ в сокет. Таким образом, создается нежелательный поток ненужной информации от сервера к браузеру, и, чем больше должна быть скорость реакции на обрыв соединения, тем больше информации приходится передавать.

Теоретически возможно определять статус ХТТП соединения, читая из сокета, а не записывая информацию в него. Но, почему-то, предполагаемый поток php://stdin при чтении из него никогда не выдает false, что значит, что он или не является адекватным сокетом хттп соединения, как я предполагал, либо не дает правильный ответ, при разрыве соединения.

Если кто знает, подскажите, возможно ли средствами пхп определить разрыв соединения путем _чтения_ из сокета или, если уж нельзя, то почему.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
php://stdin allows access to input stream of the PHP process.
Какие данные ты читаешь из stdin при соединении с клиентом?
У тебя скрипт вызывается веб-сервером или сам висит на порту как сервер?
Если из-под сервера - stdin, как мне кажется, может жить, пока есть связь с веб-сервером.
Разве stdin вообще имеет отношение к связи с клиентом?
 

camka

не самка
Автор оригинала: grigori
Какие данные ты читаешь из stdin при соединении с клиентом?
У тебя скрипт вызывается веб-сервером или сам висит на порту как сервер?
Если из-под сервера - stdin, как мне кажется, может жить, пока есть связь с веб-сервером.
Разве stdin вообще имеет отношение к связи с клиентом?
Скрипт вызывается вебсервером. Собственно, никаких данных из stdin мне не нужно, я просто хотел определить таким способом отключение соединением с браузером: в этом случае при чтении из сокета должна быть возвращена ошибка - мол, не могу считать, клиент отвалился (false). Как раз и спрашивал, правильно ли я мыслю, работая с потоком stdin. Видимо, неправильно. Но, возможно, все-таки, есть какая-то хитрость, чтобы добраться непосредсвенно до соединения веб-сервера с клиентом и считыванием из него определить статус соединения. Такой способ был бы, на мой взгляд, намного эффективнее, чем популярный нынче connection_aborted() с предварительной отсылкой чего-либо клиенту.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
от PHP это не очень-то зависит, знаешь ли ...
веб-сервер или сообщит, или нет
 

camka

не самка
То бишь, этим вы хотите сказать, что нет _никакого_ иного способа узнать об отключении соединения между веб-сервеном и браузером на стороне пхп, кроме как писать в стандартный поток вывода и проверять connection_aborted() ? А жаль. Хотя, ходят слухи, что чтением из сокета не всегда можно однозначно определить разорвавшееся TCP соединение; единственный надежный способ - писать в сокет и проверять возвращаемый статус. Изучаю спецификацию ...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
По своей сути ip передает данные пакетами, а tcp - это "обертка" над пакетами, насколько я помню спецификацию.

Технически наличие соединения на уровне ip гарантировано в момент получения отправителем ответа от получателя об успешном получении последним ip-пакета.

Кстати, пример немного другой, но показательный: ssh-соединение может "висеть" часами без передачи какой-либо информации.
Я могу открыть putty и перевести комп в спящий режим на пол-часа, а когда включу - соединение все еще будет работать.
Как по-твоему на стороне сервера определить, есть соединение, или нет? А никак - только посылая клиенту информацию раз в час :)
 
Сверху