Я часто попадал в такую ситуацию:
Мне нужен способ эффективно проверьте, активно ли сетевое соединение, что не требует выполнения HTTP (S) запросов или проверки связи с удаленными адресами. У меня не может быть много разных скриптов постоянно (каждую минуту), чтобы пинговать какой-нибудь плохой удаленный хост, чтобы посмотреть, смогут ли они его достичь. Это похоже на злоупотребление сетью, и это вряд ли хорошо для конфиденциальности.
Должен быть какой-то эффективный, «локальный» способ проверить, активно ли сетевое соединение!
С другой стороны, у меня бесчисленное количество раз Windows утверждала, что есть соединение, через визуальный значок в правом нижнем углу, когда его на самом деле нет, так что ... Если Microsoft не может разберись, я сомневаюсь, что это вообще возможно.
Я потратил на это бесчисленное количество часов на протяжении многих лет. Долгое время я пытался поговорить с OpenVPN, но, похоже, у него тоже нет такого «API», с которым можно было бы поговорить. Кажется, что это чрезвычайно сложная проблема для решения, возможно, даже невозможная.
В Linux, если вы хотите проверить статус ссылки в локальной сети, вы можете использовать системный вызов php, чтобы проверить "ethtool eth0" (или как там называется ваш интерфейс). Найдите строку «Обнаружена ссылка». Он скажет вам да или нет, если в интерфейсе есть действующая ссылка. Я серьезно сомневаюсь, что вы теряете местную ссылку ...
Если то, что вам действительно нужно, - это возможность определить подключение к Интернету по сравнению с состоянием локального канала или даже с возможностью локального IP-адреса, тогда вам нужно будет инициировать какое-то подключение к Интернету, чтобы сделать это определение.
Подумайте об этом так ... Ваш локальный сервер не знает об Интернете. Он знает только, как разрешать имена в Интернете, и знает, как туда добраться. Но у него нет способа узнать, действителен ли этот маршрут, пока он не попытается его использовать.
Вот почему так много случаев, которые вы видите, связаны с пингом. С точки зрения использования сети, это один из наименее болтливых способов определить, доступна ли удаленная сеть.
Если вас беспокоит конфиденциальность, вы всегда можете просто пропинговать маршрутизатор вашего интернет-провайдера по умолчанию. Ваш трафик уже проходит через него, поэтому пинг не представляет дополнительного риска.
Учитывая описанный вами сценарий, похоже, что проблема в вашем конкретном приложении. Для меня наличие постоянно открытого PHP CLI звучит немного схематично, но если это действительно то, что вам нужно, тогда вам нужно будет реализовать какой-то механизм keep-alive.
Если бы мне пришлось угадывать, я бы заподозрил, что где-то есть брандмауэр, который сбрасывает состояние соединения, потому что трафик не проходит. Хранитель активности должен поддерживать активное состояние.