2009-09-10 7 views
2

J'utilise la ligne de commande PHP sur linux pour ouvrir la connexion par connexion Bluetooth, et j'ai besoin d'un moyen rapide de vérifier si la connexion Internet est active. Eh bien, ne doit pas être sale, mais rapide est apprécié. :) Utiliser exec pour exécuter des commandes externes n'est pas un problème.Vérification de la connexion Internet avec la ligne de commande PHP sur Linux

Je songe à envoyer un ping à un serveur stable (par exemple google), mais je me demande s'il existe une meilleure solution. Peut-être vérifier la sortie de ifconfig? Une commande qui répondrait avec une réponse claire comme ("ne peut pas se connecter au serveur", "connecté") serait naturellement la meilleure. Des idées?

Répondre

10

Si vous voulez quelque chose qui fonctionne sans dépendre d'un serveur externe, vous pouvez rechercher un itinéraire par défaut. Cette commande permet d'imprimer le nombre de routes par défaut:

/sbin/route -n | grep -c '^0\.0\.0\.0' 

Si c'est 0, vous ne pouvez pas arriver au monde extérieur.

+0

C'est très intéressant! Cela semble être une bien meilleure approche que d'accéder à un serveur. Je l'ai essayé, et ça marche très bien. Merci! –

+0

génial ça marche :) – Sangimed

2

Vous pouvez utiliser wget une certaine web externe avec -W paramètre délai d'attente pour une telle chose. Il renvoie 1 si timeout s'est écoulé sans succès, et 0 s'il est à l'intérieur du timeout. En outre, ping peut être utilisé à cette fin, comme vous l'avez suggéré.

+0

Mon 'wget' ne semble pas avoir l'option' -W'. Timeout est défini à la place comme '-T' Aussi, comment puis-je l'obtenir pour retourner soit 0 ou 1, en utilisant' exec ('wget www.google.com -T 1') 'renvoie juste une chaîne vide. –

+1

Ups, désolé, oui - c'est -T. Je regardais les options de ping à ce moment-là. :-( Essayez ceci: exec ("wget ​​www.google.com -T 1; echo $?"). Aussi, je suggère d'augmenter le timeout à quelques secondes, pour éviter les faux rapports en raison de certains retards ou retards. – igustin

5

Si vous êtes à l'aise avec l'utilisation de exec, je (pour vérifier votre connexion Internet) ping vos serveurs DNS de votre FAI (par IP)

exec("ping -c 1 $ip 2>&1", $output, $retval); 

Vous pourriez probablement faire aussi en PHP pur en utilisant fsockopen essayer de récupérer une page sur www.google.com (le scénario wget/curl ').

if(!fsockopen("www.google.com", 80)) { 
    echo "Could not open www.google.com, connection issues?"; 
} 
+1

Bon point sur les fonctions HTTP internes de PHP. J'ai fini par utiliser le ping de toute façon car il se sentait plus adapté aux tests de connexion que wget ou même tenter d'aller chercher quelque chose avec php. L'utilisation de '-c 1' est agréable et rapide ... Le' 2> & 1' envoie apparemment la sortie à '$ output' d'exec au lieu du terminal, ce qui est sympa. Cependant, je ne suis pas familier avec ça, et c'est un peu difficile à google ... quelle est la logique là-bas? –

+1

Vous pouvez lire tout à ce sujet ici: http://tldp.org/LDP/abs/html/io-redirection.html. Explication plus rapide: http://osgeek.blogspot.com/2009/07/redirection-and-2.html – ChristopheD

+0

@ChristopheD: Ah, d'accord. Il redirige donc stderr (2) là où stdout (1) va (ce qui est dans ce cas le 'exec' de PHP). Merci pour les liens! –

3

Je suggère d'utiliser ping trop .. vous pouvez utiliser quelque chose comme:

exec("ping -c 4 www.google.com", $output, $status); 
if ($status == 0) { 
    // ping succeeded, we have connection working 
} else { 
    // ping failed, no connection 
} 

Si vous décidez d'utiliser wget, pensez à préfixer http: // à l'URL de la page que vous vouloir télécharger, et je suggère d'ajouter "-q -O -" aux options pour faire wget pas (essayer de) enregistrer dans le fichier ..

Une autre façon de le faire est d'utiliser curl/sockets sur php, mais Je pense que ce n'est pas le moyen le plus rapide que vous cherchez ..

0

Connexion Internet? Qu'est ce que c'est? S'il vous plaît, définir "connexion internet"! Vous voulez vérifier si l'utilisateur est connecté - vers où? Au serveur de votre entreprise? Eh bien, ping! Ou à où? Bien, ping google.com, mais avec cela, vous ne vérifier que si l'utilisateur est connecté au serveur de google, puisque tous les autres sites peuvent être interdits par l'administrateur du système.

Généralement, le routage réseau est un domaine dans lequel vous ne pouvez pas vérifier si vous êtes connecté à un type "Internet". Vous ne pouvez vérifier que des serveurs particuliers.

+0

Ouais, ouais, je sais qu'en théorie la connexion internet ni intenet elle-même n'existe pas vraiment. Je ne voulais simplement pas écrire cinq paragraphes de définition pour mon problème, car il avait une façon plus simple d'expliquer le problème. En pratique, ceci est un problème dans seulement quelque chose comme 0,00001% des cas. Quand j'ai un ordinateur qui n'est pas connecté, chacun d'entre nous sait ce que cela signifie de connecter l'ordinateur à "Internet". Oui, je suis sûr que ma réponse acceptée en utilisant 'route' ne fonctionnera pas dans les cas où il y a des problèmes de réseau ou des restrictions d'accès, mais bon, je vais juste régler avec 99,99999%. –

+0

J'augmenterais la probabilité à 0,1%, et cela peut devenir assez désagréable si cela arrive. Supposons que le PC est connecté à Internet, mais il n'y a pas de connexion (problèmes au FAI). * Vous devrez quand même gérer une telle situation * (pour permettre à l'utilisateur de voir des messages sensés, offrez "Travaillez hors ligne" pour éviter les tentatives futiles de se connecter à votre serveur). Mais si vous comptez sur les informations de routage, vous risquez de croire à tort que si les itinéraires sont corrects, Internet est également acceptable. Les accidents, les rapports de bogues et les données perdues sont garantis. –

+0

@Pavel: Ok, peut-être un sur un million était un peu extrême. :) Mais je pense que vous vous méprenez sur ce que j'utilise pour cela, puisque vous parlez de perte de données et de plantages. Je ne me fierais jamais * à cette méthode pour toute connexion * spécifique * - c'est juste une manière brute et rapide de comprendre quelque chose de général sur l'état de l'ordinateur, et je ne l'utilise que pour moi-même. Vérifier 'route' permet de déterminer si la connexion est active et si une tentative de reconnexion est nécessaire. C'est fiable dans la plupart des cas, et dans le cas contraire, je vais devoir examiner le problème de plus près. –

Questions connexes