我应该如何从 PHP CLI 检测网络连接(VPN)是否意外中断?

我应该如何从 PHP CLI 检测网络连接(VPN)是否意外中断?

情况:我的计算机每次开机时都会运行一个永久的 PHP CLI 脚本。它每分钟都会启动一堆子进程,每个子进程都会并行执行一些工作。(我这样做是因为如果我只是在主脚本中逐个运行例程,它们通常会花费超过一分钟的时间,然后我的系统就会变得不可靠。)

大多数情况下,它都能完美地按预期工作(经过各种各样的微调)。然而,有一种情况我至今无法解释:

有时,我的 VPN(OpenVPN)的网络连接会意外中断。最近几乎每天都会发生这种情况。每次发生这种情况时,我的“子脚本”(主要执行与网络相关的工作)都会卡住,尝试多次重试连接(每次都等待超时等)。最终结果是这些脚本的副本越来越多,最终导致我的机器瘫痪,当我回来时,我发现每个子脚本有 30 个副本同时运行,它们都陷入了几乎永恒的循环中,因为它们无法检测到网络已中断。

(是的,我有超时/连接超时等的 cURL 选项)

因此,我希望能够检测“离线状态”。事实证明,这比我最初想象的要困难得多。在 Windows 的命令行上是否有一些明显的方法可以做到这一点?当然,我的系统是完全跨平台开发的,所以我也想知道 Linux 和 macOS 的情况,但由于我主要使用 Windows,所以这对我个人来说现在最重要。

基本上,我理想情况下希望能够运行返回 0 或 1 的“isthatlittlenetworkiconinthebottomrightcornerofthescreenlitgreen.exe”。

(使用内置工具。)

希望有人能有一个明智的、跨平台的想法来检查这一点。也许 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 或其他主机之类的操作并解析结果以确保连接成功。

相关内容