情况:我的计算机每次开机时都会运行一个永久的 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 或其他主机之类的操作并解析结果以确保连接成功。