Situación: Tengo un script PHP CLI perpetuo ejecutándose cada vez que mi computadora está encendida. Cada minuto, lanza un montón de subprocesos, cada uno de los cuales realiza algún trabajo en paralelo. (Lo hago así porque si ejecuto las rutinas una por una en el script principal, a menudo tardan mucho más de un minuto y entonces mi sistema deja de ser confiable).
La mayoría de las veces, esto funciona perfectamente según lo previsto (después de muchos ajustes de todo tipo). Sin embargo, hay una situación que hasta ahora no he podido explicar:
A veces, la conexión de red a mi VPN (OpenVPN) se corta inesperadamente. Ha estado sucediendo casi a diario últimamente. Cada vez que esto ocurre, mis "subguiones" (que principalmente realizan trabajos relacionados con la red) se atascan al intentar volver a intentar conectarme muchas veces (y esperando el tiempo de espera cada vez, etc.). El resultado final es que se acumulan más y más copias de estos scripts, lo que finalmente hace que mi máquina se ponga de rodillas cuando vuelvo y me doy cuenta de que tiene 30 copias de cada uno de estos subscripts ejecutándose al mismo tiempo, todas atascadas. un bucle casi eterno porque no pueden detectar que la red está caída.
(Sí, tengo las opciones de cURL para tiempo de espera/tiempo de espera de conexión, etc.)
Por este motivo me gustaría poder detectar la "desconexión". Esto resultó ser mucho más difícil de lo que imaginaba al principio. ¿Existe alguna forma obvia de hacer esto en la línea de comando en Windows? Por supuesto, mi sistema está desarrollado para ser completamente multiplataforma, por lo que me gustaría saber esto también para Linux y macOS, pero como uso principalmente Windows, eso es lo más importante para mí personalmente en este momento.
Básicamente, lo ideal sería poder ejecutar "es ese pequeño icono de red en la esquina inferior derecha de la pantalla iluminada en verde.exe" que devuelve 0 o 1.
(Con herramientas integradas).
Con suerte, alguien tendrá una idea sensata y multiplataforma para comprobar esto. ¿Quizás incluso el propio PHP tiene esto integrado como función? (Sí claro...)
Respuesta1
Si desea probar si su conexión VPN todavía está activa, puede hacer algo simple como verificar cómo se muestra su IP pública:
<?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;
}
aunque eso requeriría que su máquina tenga una IP pública estática.
Si solo desea ver si está conectado a Internet, puede hacer algo como ping o curl google.com o algún otro host y analizar el resultado para asegurarse de que la conexión se haya realizado correctamente.