Как определить, произошло ли неожиданное отключение сетевого соединения (VPN) с помощью PHP CLI?

Как определить, произошло ли неожиданное отключение сетевого соединения (VPN) с помощью PHP CLI?

Ситуация: У меня есть постоянный 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 или какого-либо другого хоста и проанализировать результат, чтобы убедиться в успешности подключения.

Связанный контент