情況:每當我的電腦開機時,我都會執行永久的 PHP CLI 腳本。每分鐘,它都會啟動一堆子進程,每個子進程並行執行一些工作。 (我這樣做是因為如果我只是在主腳本中逐一運行例程,它們通常需要比一分鐘長得多的時間,然後我的系統就會變得不可靠。)
大多數時候,這可以完美地按預期工作(經過大量各種微調之後)。然而,有一種情況我至今無法解釋:
有時,我的 VPN (OpenVPN) 的網路連線會意外中斷。最近這樣的事情幾乎每天都會發生。每次發生這種情況時,我的“子腳本”(主要執行與網路相關的工作)都會多次嘗試重試連接(並且每次都等待超時等)。最終的結果是這些腳本的副本越來越多,最終讓我的機器爬行,當我回來時發現它同時運行著每個子腳本的 30 個副本,所有這些都卡在了一個幾乎永恆的循環,因為他們無法偵測到網路已關閉。
(是的,我有超時/連接超時等 cURL 選項)
因此,我希望能夠檢測“離線”。事實證明這比我最初想像的要困難得多。有沒有一些明顯的方法可以在 Windows 的命令列上執行此操作?當然,我的系統是為了完全跨平台而開發的,所以我也想知道 Linux 和 macOS 的情況,但由於我主要使用 Windows,所以這對我個人來說現在是最重要的。
基本上,我理想地希望能夠運行“isthatlittlenetworkiconinthebottomrightcornerofthescreenlitgreen.exe”,它返回 0 或 1。
(使用內建工具。)
希望有人能有一個理智的、跨平台的想法來檢視這一點。也許甚至 PHP 本身也將其作為函數內建了? (是啊,對…)
答案1
如果您想測試您的 VPN 連線是否仍然有效,您可以執行一些簡單的操作,例如檢查您的 publicIP 顯示為:
<?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 或其他主機之類的操作,並解析結果以確保連接成功。