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).
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");
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
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";
}
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";
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.';
}
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;
}
}