状況: コンピュータの電源がオンになると、PHP CLI スクリプトが常に実行されます。1 分ごとに、一連のサブプロセスが起動され、それぞれが並行して作業を実行します。(メイン スクリプトでルーチンを 1 つずつ実行すると、1 分よりも長くかかることが多く、システムが信頼できなくなるため、このようにしています。)
ほとんどの場合、これは意図したとおりに完璧に機能します (さまざまな微調整を行った後)。ただし、これまで説明できなかった状況があります。
時々、VPN (OpenVPN) へのネットワーク接続が突然ダウンすることがあります。最近はほぼ毎日発生しています。これが発生するたびに、私の「サブ スクリプト」(主にネットワーク関連の作業を行う) は、接続を何度も再試行しようとして (そのたびにタイムアウトを待機するなど) 停止します。最終的には、これらのスクリプトのコピーがどんどん積み重なり、最終的にはマシンがひざまずいて、戻ってみると、これらのサブ スクリプトの 30 個のコピーが同時に実行されており、ネットワークがダウンしていることを検出できないため、すべてがほぼ永久ループに陥っていることに気付きます。
(はい、timeout/connecttimeout などの cURL オプションがあります)
このため、「オフライン」を検出できるようにしたいのですが、これは当初想像していたよりもはるかに困難であることがわかりました。Windows のコマンド ラインでこれを行う明白な方法はありますか? もちろん、私のシステムは完全にクロスプラットフォームになるように開発されているので、Linux と macOS でもこれを知りたいのですが、私は主に Windows を使用しているので、それが今のところ私にとって最も重要です。
基本的に、理想的には、0 または 1 を返す「isthatlittlenetworkiconinthebottomrightcornerofthescreenlitgreen.exe」を実行できるようにしたいと考えています。
(ツールが内蔵されています。)
うまくいけば、誰かがこれをチェックするための健全なクロスプラットフォームのアイデアを持っているでしょう。おそらく 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 が設定されている必要があります。
インターネットに接続されているかどうかだけを確認したい場合は、google.com または他のホストに対して ping や curl などの操作を実行し、結果を解析して接続が成功したかどうかを確認できます。