Ситуация: У меня есть постоянный PHP CLI-скрипт, работающий всякий раз, когда мой компьютер включен. Каждую минуту он запускает кучу подпроцессов, каждый из которых выполняет какую-то работу параллельно. (Я делаю это так, потому что если я просто запускаю процедуры одну за другой в основном скрипте, они часто занимают гораздо больше одной минуты, и тогда моя система становится ненадежной.)
В большинстве случаев это работает идеально, как и задумано (после множества доработок всех видов). Однако есть ситуация, которую я пока не смог объяснить:
Иногда сетевое соединение с моим VPN (OpenVPN) неожиданно отключается. В последнее время это происходит почти ежедневно. Каждый раз, когда это происходит, мои «подскрипты» (которые в основном выполняют работу, связанную с сетью) застревают, пытаясь повторить попытку подключения много раз (и каждый раз ожидая тайм-аута и т. д.). Конечным результатом является то, что все больше и больше копий этих скриптов накапливаются, в конечном итоге заставляя мою машину ползать на коленях, когда я возвращаюсь и понимаю, что у нее одновременно запущено 30 копий каждого из этих подскриптов, и все они застряли в почти вечном цикле, потому что они не могут определить, что сеть отключена.
(Да, у меня есть параметры cURL для timeout/connecttimeout и т. д.)
По этой причине я хотел бы иметь возможность определять «офлайн-состояние». Это оказалось гораздо сложнее, чем я себе представлял поначалу. Есть ли какой-то очевидный способ сделать это в командной строке в Windows? Конечно, моя система разработана как полностью кроссплатформенная, поэтому я хотел бы знать это также для Linux и macOS, но поскольку я в основном использую Windows, это самое важное для меня лично сейчас.
По сути, в идеале я хотел бы иметь возможность запустить «isthatlittlenetworkiconinthebottomrightcornerofthescreenlitgreen.exe», который возвращает 0 или 1.
(Со встроенными инструментами.)
Надеюсь, у кого-нибудь появится здравая, кроссплатформенная идея для проверки этого. Может быть, даже в самом PHP это встроено как функция? (Да, верно...)
решение1
Если вы хотите проверить, активно ли ваше VPN-подключение, вы можете сделать что-то простое, например, проверить, что отображается в вашем публичном IP-адресе:
<?php
function connectedtoVPN() {
$localPubIP = "123.456.789.012";
$result = `curl icanhazip.com`;
if ($result == $localPubIP) {
// not connected to VPN
return false;
}
// connected to VPN
// (or my public IP has changed!)
return true;
}
хотя для этого потребуется, чтобы у вашего компьютера был статический публичный IP-адрес.
Если вы просто хотите проверить, подключен ли он вообще к Интернету, вы можете выполнить команду ping или curl для google.com или какого-либо другого хоста и проанализировать результат, чтобы убедиться в успешности подключения.