Ping plusieurs serveurs

Ce sujet est résolu
Default
,

Bonjour,

Voila je rencontre un petit problème avec mon code.

<?php
$hs = false;

$hosts = ["192.168.0.4","192.168.0.49"];

foreach ($hosts as $host)
echo "

";
{
$ping = exec("ping -n 2 $host");
if ( strcmp("ms", substr($ping, -2)) == 0)
{
echo "";
}
else
{
echo "";
$hs = true;
}
}
?>

J'aimerais pinguer plusieurs serveurs et n'avoir qu'une seule et unique reponse.
C'est à dire, quand tous les serveurs sont OK il utilise "vert.gif" dés que un seul des serveurs ne ping pas il utilise "rougeclignote.gif".
Avec 1 serveur cela fonctionne mais dés que j'en met plusieurs il ne me prend en compte la derniere adresse de la liste.

Merci de votre aide.

11 Réponse

Default
,

Effectivement, il manquait un $ devant hs pour passer sur la variable.

Si tu met ton echo dans ta boucle, ça me parait évident que ça va afficher plusieurs lignes, non ?

Là, l'objectif de la boucle c'est juste de savoir si une machine est hs, sans rien afficher.
Et ensuite, fonction de ta variable hs, tu affiches vert ou rouge.

<?php
$hs = false;
$hosts = ["192.168.0.49","192.168.0.49","192.168.0.4"];
foreach ($hosts as $host) {
  $ping = exec("ping -n 1 {$host}");
  if ( substr($ping, -2) != 'ms') {
    $hs = true;
    break;
  }
}
echo "<td width=60><a href='/test02.php'><img src=/". ($hs ? "rougeclignote.gif" : "vert.gif") ."></a></td>";


?> 
Default
,

tu utilises la même variable pour stocker.
=> soit tu n'as besoin que d'un seul résultat, et tu peux utiliser "break", soit tu as besoin de tous les résultats, et il faut faire un & sur tes tests

<?php
$hs = false;
$hosts = ["192.168.0.4","192.168.0.49"];
foreach ($hosts as $host) {
  $ping = exec("ping -n 2 $host");
  if ( strcmp("ms", substr($ping, -2)) != 0) {
    $hs = true;
     break;
  }
}
?> 
Default
,

et en fait, non, puisque tu set ta variable en dehors de la boucle, donc effectivement, tu ne devrais avoir true que si l'une ne fonctionne pas.
donc ça a plutôt l'air d'être ton "if strcmp" qui ne fonctionne pas.

Default
,

En faite j'ai besoin de TOUS les resultats mais en un seul resultat. Si tous les serveurs sont OK il me dit OK, si un seul serveur est HS il me dit HS, même si il ya 1 serveur HS sur 150.
Merci d'avance

Default
,

En fait, le echo que tu as ajouté pour sauter une ligne fait que la boucle ne traite que ça : les accolades sont au mauvais endroit
perso, j'aurais plutôt écrit ça comme ça :

$hs = false;
$hosts = ["192.168.0.4","192.168.0.49"];
foreach ($hosts as $host) {
  echo "\n";
  $ping = exec("ping -n -c 1 {$host}");
  if ( empty($ping) ) {
     echo "machine {$host} HS";
    $hs = true;
    break;
  } else {
    echo "machine {$host} OK";
  }
}
Default
,

Ton code me donne l'état des serveurs un par un, ainsi que OK même si le serveur est KO.
J'aimerais avoir une réponse unique pour l'ensemble des serveurs.
Exemple:

  • Si TOUS les serveurs sont OK il affiche juste OK.
  • Si même 1 des 50 serveurs est HS il affiche HS.
Default
,

Si quelqu'un peux avoir une solution a mon probléme.
Merci d'avance

Default
,

J'étais reparti de ton code initial qui mettait des echo partout...

$hs = false;
$hosts = ["192.168.0.4","192.168.0.49"];
foreach ($hosts as $host) {
  $ping = exec("ping -n -c 1 {$host}");
  if ( empty($ping) ) {
    $hs = true;
    break;
  } 
}
echo hs ? "KO" : "OK"

Le test empty($ping) fonctionne chez moi pour vérifier que la machine est hs (pas de réponse du ping).
Si ce code est toujors KO, ce serait mieux de fournir le contenu de $ping quand la machine est up et quand elle est down. Cela permettrait d'ajuster le test.

Default
,

Merci de ta réponse.
Maintenant il me donne :

Warning: Use of undefined constant hs - assumed 'hs' (this will throw an Error in a future version of PHP) in C:\xampp\htdocs\test.php on line 11
KO

la ligne 11 est : echo hs ? "KO" : "OK"

Default
,

Alors j'ai un mieux..
Maintenant il me donne les OK et s'arrete au prochain HS.
Le probléme c'est que je veux juste une seule et unique réponse.
Dés qu'il arrive à un serveur HS, il ne me donne pas les réponse OK, juste la réponse KO.
Et si TOUT est OK il me dis juste OK.

<?php
$hs = false;
$hosts = ["192.168.0.49","192.168.0.49","192.168.0.4"];
foreach ($hosts as $host) 
{
  $ping = exec("ping -n 1 {$host}");
if ( substr($ping, -2) == 'ms') 

{
    echo "<td width=60><a href='/test02.php'><img src=/vert.gif></a></td>";
} 
 else
{
    echo "<td width=60><a href='/test02.php'><img src=/rougeclignote.gif></a></td>";
    $hs = true;
    break;
}
}

?> 

Merci d'avance

Default
,

Merci Merci Merci
Tu me sauve la vie.
Cela fait depuis avril que je cherche une solution et tu me l'apporte en 2jours.
Bravo à toi et encore merci pour tout.