web-dev-qa-db-fra.com

Déterminer en script php si connecté à internet?

Comment puis-je vérifier si je suis connecté à Internet à partir de mon script PHP qui s'exécute sur ma machine de développement?

Je lance le script pour télécharger un ensemble de fichiers (qui peuvent ou non exister) en utilisant wget. Si j'essaye de télécharger sans être connecté, wget passe au suivant en pensant que le fichier n'est pas présent.

40
Steve
<?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;

}
?>
73
blasteralfred Ψ

Vous pouvez toujours envoyer une requête ping à votre bon google:

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

Ce code échouait dans la structure laravel 4.2 php avec une erreur de serveur interne 500:

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

Ce que je ne voulais pas insister pour comprendre cela, c'est pourquoi j'ai essayé ce code et cela a fonctionné pour moi:

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

} 

Veuillez noter que: Ceci est basé sur l'hypothèse que la connexion à google.com est moins sujette à l'échec. 

6
user28864

Pourquoi ne récupérez-vous pas le code de retour de wget pour déterminer si le téléchargement a réussi ou non? La liste des valeurs possibles peut être trouvée à l'état de sortie wget .

D'autre part, vous pouvez également utiliser les fonctions curl de PHP, vous pouvez alors effectuer le suivi des erreurs depuis PHP.

3
wimvds

Plusieurs facteurs déterminent la connexion Internet. L'état de l'interface, par exemple. Mais, en ce qui concerne ceux-ci, en raison de la nature du réseau, une configuration appropriée ne signifie pas que vous avez une connexion fonctionnelle.

Le meilleur moyen est donc de télécharger un fichier dont vous êtes certain qu’il existe. Si vous réussissez, vous pouvez suivre les étapes suivantes. Sinon, réessayez une fois puis échouez.

Essayez de choisir un à l'hôte de destination. Si ce n’est pas possible, choisissez un site Web majeur comme Google ou Yahoo.

Enfin, essayez simplement de vérifier le code d'erreur renvoyé par wget. Je parie que ce sont différents pour 404-s et les délais d'attente. Vous pouvez utiliser le troisième paramètre dans l'appel exec:

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

1
Maciej Łebkowski

Vous pouvez faire un ping vers un site populaire ou vers le site d'où vous venez (comme www.google.nl), puis analyser le résultat pour voir si vous pouvez vous y connecter.

<?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
Roy T.
/*
 * Usage: is_connected('www.google.com')
 */
function is_connected($addr)
  {
    if (!$socket = @fsockopen($addr, 80, $num, $error, 5)) {
      echo "OFF";
    } else {
      echo "ON";
    }
  }
0
CagCak

Il suffit de vérifier le résultat de wget. Un code d'état de 4 indique un problème de réseau, un code d'état de 8 indique une erreur de serveur (telle qu'un 404). Cela ne fonctionne que si vous appelez wget pour chaque fichier en séquence, plutôt qu'une fois pour tous les fichiers.

Vous pouvez également utiliser libcurl avec PHP au lieu d'appeler wget. Quelque chose comme:

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
Dietrich Epp

La réponse acceptée n'a pas fonctionné pour moi. Lorsque l'Internet a été déconnecté, il a lancé une erreur php. Donc je l'ai utilisé avec une petite modification qui est ci-dessous:

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

Cette fonction gère ce dont vous avez besoin

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;
}
0
Lost Koder