Situation: Ich habe ein PHP-CLI-Skript, das immer läuft, wenn mein Computer eingeschaltet ist. Jede Minute startet es eine Reihe von Unterprozessen, die jeweils parallel etwas erledigen. (Ich mache das so, weil es oft viel länger als eine Minute dauert, wenn ich die Routinen im Hauptskript einfach einzeln ausführe, und dann wird mein System unzuverlässig.)
Meistens funktioniert das (nach vielen Feineinstellungen aller Art) wie vorgesehen. Es gibt jedoch eine Situation, die ich mir bisher nicht erklären konnte:
Manchmal bricht die Netzwerkverbindung zu meinem VPN (OpenVPN) unerwartet ab. Das passiert in letzter Zeit fast täglich. Jedes Mal, wenn das passiert, bleiben meine „Subskripte“ (die hauptsächlich netzwerkbezogene Arbeit leisten) hängen und versuchen viele Male, die Verbindung erneut herzustellen (und warten jedes Mal auf eine Zeitüberschreitung usw.). Das Endergebnis ist, dass sich immer mehr Kopien dieser Skripte stapeln, bis mein Rechner schließlich in die Knie geht, wenn ich zurückkomme und feststelle, dass 30 Kopien jedes dieser Subskripte gleichzeitig ausgeführt werden und alle in einer fast endlosen Schleife stecken, weil sie nicht erkennen können, dass das Netzwerk ausgefallen ist.
(Ja, ich habe die cURL-Optionen für Timeout/ConnectTimeout usw.)
Aus diesem Grund möchte ich in der Lage sein, „Offline-Zustand“ zu erkennen. Dies erwies sich als viel schwieriger, als ich zunächst dachte. Gibt es eine offensichtliche Möglichkeit, dies auf der Befehlszeile unter Windows zu tun? Natürlich ist mein System so entwickelt, dass es vollständig plattformübergreifend ist, daher würde ich dies auch gerne für Linux und macOS wissen, aber da ich hauptsächlich unter Windows arbeite, ist dies für mich persönlich im Moment am wichtigsten.
Im Grunde wäre es ideal, wenn ich „isthatlittlenetworkiconinthebottomrightcornerofthescreenlitgreen.exe“ ausführen könnte, was 0 oder 1 zurückgibt.
(Mit integrierten Werkzeugen.)
Hoffentlich hat jemand eine vernünftige, plattformübergreifende Idee, um dies zu überprüfen. Vielleicht ist dies sogar in PHP selbst als Funktion integriert? (Ja, klar ...)
Antwort1
Wenn Sie testen möchten, ob Ihre VPN-Verbindung noch aktiv ist, können Sie einfach Folgendes tun: Überprüfen Sie beispielsweise, wie Ihre öffentliche IP-Adresse angezeigt wird:
<?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;
}
Dies würde allerdings erfordern, dass Ihr Computer über eine statische öffentliche IP verfügt.
Wenn Sie nur sehen möchten, ob überhaupt eine Verbindung zum Internet besteht, können Sie beispielsweise einen Ping oder Curl an google.com oder einen anderen Host senden und das Ergebnis analysieren, um sicherzustellen, dass die Verbindung erfolgreich war.