Прежде всего, используйте stream_set_timeout () , чтобы установить для тайм-аута (уже открытого) сокета значение, меньшее, чем тайм-аут сервера для проверки связи.
Затем измените условие цикла на: while(fgets(...) || !$done)
Если вы не получите ответа, время ожидания fgets истечет, и вам может потребоваться отключить предупреждение для этого. Но, таким образом, вы можете отправить что-то на сервер, чтобы он не отключал вас, ДО того как вы получите время ожидания ping. Просто измените флаг $ done и установите его в true, если вы действительно хотите отключиться (как бы вы это ни делали).
Не уверен, что это работает, но, вероятно, стоит попробовать.
Добавление: я думал об условии выхода, вероятно, было бы лучше вручную выйти из while
(используя break
) вместо установки флага. Таким образом, вы можете изменить условие на while(fgets(...) || 1)
. В противном случае вы можете застрять в бесконечном цикле, когда сервер продолжает отправлять контент.