web-dev-qa-db-fra.com

Faire un ping sur une adresse IP en utilisant PHP et en écho au résultat

J'ai la fonction suivante que je ne travaille pas jusqu'à présent. Je voudrais cingler une adresse IP et ensuite faire écho si l'IP est en vie ou pas.

function pingAddress($ip){
    $pingresult = Shell_exec("start /b ping $ip -n 1");
    $dead = "Request timed out.";
    $deadoralive = strpos($dead, $pingresult);

    if ($deadoralive == false){
        echo "The IP address, $ip, is dead";
    } else {
        echo "The IP address, $ip, is alive";
    }

}

Quand j'appelle cette fonction en utilisant l'exemple:

pingAddress("127.0.0.1")

Le résultat de l'écho est toujours "mort", peu importe le résultat.

Quelqu'un pourrait-il m'aider s'il vous plaît où je vais mal?

Merci beaucoup.

Mise à jour: Code amendé pour inclure les guillemets mais obtenir toujours les mêmes résultats (incorrects).

15
Bernard

REMARQUE: La solution ci-dessous ne fonctionne pas sous Windows. Sur linux, exécuter une commande "quel ping" depuis la console et définir le chemin de commande (de l'appel exec suggéré) en conséquence

Je pense que vous voulez vérifier le statut de sortie de la commande, alors que Shell_exec vous donne une sortie complète (peut être dangereux si la commande change de version à version. Pour une raison quelconque). De plus, votre variable $ ip n'est pas interprétée entre guillemets simples. Vous devrez utiliser des doubles "". C’est peut-être la seule chose à corriger pour que cela fonctionne.

Mais je pense que le code suivant peut être plus "portable". À mon humble avis, il est en fait préférable de saisir l'état de sortie plutôt que d'essayer d'analyser la chaîne de résultat. À mon humble avis, il est également préférable de spécifier le chemin complet de la commande ping.

<?php
function pingAddress($ip) {
    $pingresult = exec("/bin/ping -n 3 $ip", $outcome, $status);
    if (0 == $status) {
        $status = "alive";
    } else {
        $status = "dead";
    }
    echo "The IP address, $ip, is  ".$status;
}

pingAddress("127.0.0.1");
15
maraspin

Cela aussi n'a pas fonctionné pour moi dans Wordpress. J'ai aussi essayé -t et -n et d'autres méthodes, mais cela n'a pas fonctionné. J'ai utilisé,

function pingAddress($ip) {
    $pingresult = exec("/bin/ping -c2 -w2 $ip", $outcome, $status);  
    if ($status==0) {
    $status = "alive";
    } else {
    $status = "dead";
    }
    $message .= '<div id="dialog-block-left">';
    $message .= '<div id="ip-status">The IP address, '.$ip.', is  '.$status.'</div><div style="clear:both"></div>';    
    return $message;
}
// Some IP Address
pingAddress("192.168.1.1"); 

Cela a parfaitement fonctionné pour moi, enfin… .. Je l'ai référé de http://www.phpscriptsdaily.com/php/php-ping/ J'espère que cela vous aidera

Eh bien, je veux modifier ceci car cela fonctionne bien sur mon hôte local mais pas sur mon serveur réel Pour le serveur réel, j’ai un autre élément qui fonctionne à la fois pour le local et pour le direct.

$fp = fSockOpen($ip,80,$errno,$errstr,1);
if($fp) { $status=0; fclose($fp); } else { $status=1; }

Ensuite, je montre le serveur est en place pour 0 et en baisse pour 1.

Cela fonctionne parfaitement pour moi. Je l'ai eu de Ping site et retourne le résultat dans PHP Merci @ karim79

6
Nilamkumar Patel

cela fonctionne bien pour moi ..

$Host="127.0.0.1";
$output=Shell_exec('ping -n 1 '.$Host);

echo "<pre>$output</pre>"; //for viewing the ping result, if not need it just remove it

if (strpos($output, 'out') !== false) {
    echo "Dead";
}
    elseif(strpos($output, 'expired') !== false)
{
    echo "Network Error";
}
    elseif(strpos($output, 'data') !== false)
{
    echo "Alive";
}
else
{
    echo "Unknown Error";
}
1
Arif Yaacob

J'ai développé l'algorithme pour fonctionner avec des systèmes d'exploitation hétérogènes, Windows et Linux.

Implémentez la classe suivante: 

<?php

    class CheckDevice {

        public function myOS(){
            if (strtoupper(substr(PHP_OS, 0, 3)) === (chr(87).chr(73).chr(78)))
                return true;

            return false;
        }

        public function ping($ip_addr){
            if ($this->myOS()){
                if (!exec("ping -n 1 -w 1 ".$ip_addr." 2>NUL > NUL && (echo 0) || (echo 1)"))
                    return true;
            } else {
                if (!exec("ping -q -c1 ".$ip_addr." >/dev/null 2>&1 ; echo $?"))
                    return true;
            }

            return false;
        }
    }

    $ip_addr = "151.101.193.69"; #DNS: www.stackoverflow.com

    if ((new CheckDevice())->ping($ip_addr))
        echo "The device exists";
    else 
        echo "The device is not connected";
1
Jerson Martínez

Pour Windows Utilisez cette classe

$Host = 'www.example.com';
$ping = new Ping($Host);
$latency = $ping->ping();
if ($latency !== false) {
 print 'Latency is ' . $latency . ' ms';
}
else {
print 'Host could not be reached.';
}

https://github.com/geerlingguy/Ping

0
Kuldeep

Vérifiez les pages de manuel de votre commande ping avant d’essayer certains de ces exemples (toujours une bonne pratique de toute façon). Pour Ubuntu 16 (par exemple), la réponse acceptée ne fonctionne pas car -n 3 échoue (il ne s'agit plus du nombre de paquets, -n indique que l'adresse IP n'est pas convertie en un nom d'hôte). 

Suite à la demande du PO, une fonction alternative potentielle serait la suivante:

function checkPing($ip){
    $ping = trim(`which ping`);
    $ll = exec($ping . '-n -c2 ' . $ip, $output, $retVar);
    if($retVar == 0){
        echo "The IP address, $ip, is alive";
        return true;
    } else {
        echo "The IP address, $ip, is dead";
        return false;
    }
}
0
bnoeafk