2011-02-01 60 views
35

¿Cómo puedo verificar si estoy conectado a Internet desde mi script PHP que se ejecuta en mi máquina de desarrollo?Determinar en script php si está conectado a internet?

Ejecuto el script para descargar un conjunto de archivos (que pueden existir o no) usando wget. Si intento descargar sin estar conectado, wget pasa al siguiente pensando que el archivo no está presente.

Respuesta

57
<?php 
function is_connected() 
{ 
    $connected = @fsockopen("www.example.com", 80); 
             //website, port (try 80 or 443) 
    if ($connected){ 
     $is_conn = true; //action when connected 
     fclose($connected); 
    }else{ 
     $is_conn = false; //action in connection failure 
    } 
    return $is_conn; 

} 
?> 
+2

+ Buena respuesta, alguien más podría pensar que '[80 | 443]' cambiaría entre cualquiera de los puertos ... :) – Baba

+0

tienes razón @Baba ... :) –

+1

Basado en [esto] (https: // www .quora.com/Downtime/What-is-the-most-reliable-website-in-terms-of-uptime) post, probablemente tendría mucho sentido usar example.com como el "www.some_domain.com "de la respuesta. – nzn

0

Puede hacer ping a un sitio popular o al sitio desde el que está wgetting (como www.google. nl) luego analiza el resultado para ver si te puedes conectar a él.

<?php 
$ip = '127.0.0.1'; //some ip 
exec("ping -n 4 $ip 2>&1", $output, $retval); 
if ($retval != 0) { 
echo "no!"; 
} 
else 
{ 
echo "yes!"; } 
?> 
+0

Excepto en realidad no hacerlo por la dirección IP. –

+0

¿Y por qué no utilizar alguna IP? Eso es exactamente lo que ocurre detrás de las escenas usando algún dominio de todos modos. – killstreet

6

Siempre se puede hacer ping buena 'ol Google de confianza:

$response = null; 
system("ping -c 1 google.com", $response); 
if($response == 0) 
{ 
    // this means you are connected 
} 
+5

Esto es bastante confiable, pero tenga en cuenta que "ICMP funciona! = El TCP funciona" (con firewalls, NAT y otras cosas), e incluso "¡TCP funciona! = El HTTP funciona" (proxies transparentes, etc.). – Piskvor

1

Hay varios factores que determinan la conexión a Internet. El estado de la interfaz, por ejemplo. Pero, teniendo en cuenta la naturaleza de la red, la configuración adecuada no significa que tenga una conexión funcional.

Así que la mejor manera es intentar descargar un archivo que está seguro que existe. Si tiene éxito, puede seguir los siguientes pasos. Si no, vuelva a intentarlo una vez y luego falle.

Intente elegir uno en el host de destino. Si no es posible, elija algún sitio web importante como google o yahoo.

Finalmente, simplemente intente comprobar el código de error devuelto por wget. Apuesto a que son diferentes para 404-s y tiempos de espera. Se puede utilizar en el tercer parámetro exec llamada:

string exec (string $command [, array &$output [, int &$return_var ]])

3

¿Por qué no buscar el código de retorno de wget para determinar si la descarga se ha realizado correctamente? La lista de valores posibles se puede encontrar en wget exit status.

Por otro lado, puede usar php's curl functions también, entonces puede hacer todo el seguimiento de errores desde PHP.

0

Simplemente marque el resultado de wget. Un código de estado de 4 indica un problema de red, un código de estado de 8 indica un error del servidor (como un 404). Esto solo funciona si llama a wget para cada archivo en secuencia, en lugar de una vez para todos los archivos.

También puede usar libcurl con PHP, en lugar de llamar a wget. Algo así como:

foreach (...) { 
    $c = curl_init($url); 
    $f = fopen($filepath, "w") 
    curl_setopt($c, CURLOPT_FILE, $f); 
    curl_setopt($c, CURLOPT_HEADER, 0); 
    if (curl_exec($c)) { 
     if (curl_getinfo($c, CURLINFO_HTTP_CODE) == 200) { 
      // success 
     } else { 
      // 404 or something, delete file 
      unlink($filepath); 
     } 
    } else { 
     // network error or server down 
     break; // abort 
    } 
    curl_close($c); 
} 
+0

La constante para el código http es CURLINFO_HTTP_CODE –

5

Este código estaba fallando en laravel marco 4.2 php con un servidor 500 error interno:

<?php 
    function is_connected() 
    { 
     $connected = @fsockopen("www.some_domain.com", 80); 
     //website, port (try 80 or 443) 
     if ($connected){ 
      $is_conn = true; //action when connected 
      fclose($connected); 
     }else{ 
     $is_conn = false; //action in connection failure 
     } 
     return $is_conn; 
    } 
?> 

que yo no quiero hacer hincapié en mí mismo para darse cuenta de eso, por lo tanto, he intentado este código y funcionó para mí:

function is_connected() 
{ 
    $connected = fopen("http://www.google.com:80/","r"); 
    if($connected) 
    { 
    return true; 
    } else { 
    return false; 
    } 

} 

Tenga en cuenta que: esto se basa en la suposición de que la conexión a google.com es menos propenso al fracaso.

0

La respuesta aceptada no funcionó para mí. Cuando se desconectó Internet, arrojó un error de php. Así que he usado con una pequeña modificación que está por debajo:

if(!$sock = @fsockopen('www.google.com', 80)) 
{ 
    echo 'Not Connected'; 
} 
else 
{ 
echo 'Connected'; 
} 
0

Esta función se encarga de lo que necesita

function isConnected() 
{ 
    // use 80 for http or 443 for https protocol 
    $connected = @fsockopen("www.example.com", 80); 
    if ($connected){ 
     fclose($connected); 
     return true; 
    } 
    return false; 
} 
Cuestiones relacionadas