Como devo detectar se a conexão de rede (VPN) morreu inesperadamente no PHP CLI?

Como devo detectar se a conexão de rede (VPN) morreu inesperadamente no PHP CLI?

Situação: Tenho um script PHP CLI perpétuo em execução sempre que meu computador é ligado. A cada minuto, ele lança vários subprocessos, cada um deles realizando algum trabalho em paralelo. (Eu faço assim porque se eu apenas executar as rotinas uma por uma no script principal, elas geralmente demoram muito mais do que um minuto e meu sistema se torna não confiável.)

Na maioria das vezes, isso funciona perfeitamente como pretendido (depois de muitos ajustes de todos os tipos). No entanto, há uma situação que até agora não consegui explicar:

Às vezes, a conexão de rede com minha VPN (OpenVPN) cai inesperadamente. Isso tem acontecido quase diariamente ultimamente. Cada vez que isso ocorre, meus "subscripts" (que fazem principalmente trabalhos relacionados à rede) ficam presos tentando tentar conectar novamente várias vezes (e aguardando o tempo limite a cada vez, etc.). O resultado final é que mais e mais cópias desses scripts se acumulam, eventualmente fazendo minha máquina rastejar de joelhos quando volto e percebo que ela tem 30 cópias de cada um desses subscripts rodando ao mesmo tempo, todas presas. um loop quase eterno porque eles não conseguem detectar que a rede está inoperante.

(Sim, tenho as opções cURL para timeout/connecttimeout, etc.)

Por este motivo, gostaria de poder detectar "offline". Isto provou ser muito mais difícil do que eu inicialmente imaginava. Existe alguma maneira óbvia de fazer isso na linha de comando do Windows? Claro, meu sistema foi desenvolvido para ser totalmente multiplataforma, então eu gostaria de saber isso também para Linux e macOS, mas como estou principalmente no Windows, isso é o mais importante para mim pessoalmente no momento.

Basicamente, o ideal seria poder executar "isthatlittlenetworkiconinthebottomrightcornerofthescreenlitgreen.exe", que retorna 0 ou 1.

(Com ferramentas integradas.)

Esperançosamente, alguém terá uma ideia sensata e multiplataforma para verificar isso. Talvez até o próprio PHP tenha isso integrado como uma função? (Okay, certo...)

Responder1

Se quiser testar se sua conexão VPN ainda está ativa, você pode fazer algo simples, como verificar o que seu IP público está mostrando como:

<?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;
}

embora isso exija que sua máquina tenha um IP público estático.

Se você quiser apenas ver se ele está conectado à Internet, você pode fazer algo como ping ou curl google.com ou algum outro host e analisar o resultado para ter certeza de que a conexão foi bem-sucedida.

informação relacionada