我應該如何偵測 PHP CLI 的網路連線 (VPN) 是否意外中斷?

我應該如何偵測 PHP CLI 的網路連線 (VPN) 是否意外中斷?

情況:每當我的電腦開機時,我都會執行永久的 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 或其他主機之類的操作,並解析結果以確保連接成功。

相關內容