Page 1 sur 1

[Résolu] affichage d'un 'ping' dans une page HTML

Posté : 19 déc. 2007, 00:54
par zest
Bonjour,

Pour diverses raisons je dois 'pinguer' certains équipement réseaux...
Mon problème concerne la sortie/affichage du ping.
Code:
<?php
$rsltPing = exec("ping 192.168.1.1", $output);
while (list(,$val) = each($output)) :
   $val = str_replace('ÿ','',$val);
   $val = str_replace('ˆ','ê',$val);
   $val = str_replace('‡','ç',$val);
   $val = str_replace('“','ô',$val);
   $val = str_replace('R,p','Rép',$val);
    echo "<pre>$val</pre>";
endwhile ;
?>
or la sortie affichage ne me conviens pas, les ',' (virgules) ne sont pas remplacées par 'é' (en fait R,p par Rép)
Citation:
Envoi d'une requête 'ping' sur 192.168.1.1 avec 32 octets de donn‚es:

R‚ponse de 192.168.1.1: octets=32 temps=1 ms TTL=64

R‚ponse de 192.168.1.1: octets=32 temps<1ms TTL=64

R‚ponse de 192.168.1.1: octets=32 temps<1ms TTL=64

R‚ponse de 192.168.1.1: octets=32 temps=1 ms TTL=64

Statistiques Ping pour 192.168.1.1:

Paquets: envoy‚s = 4, reçus = 4, perdus = 0 (perte 0%),

Dur‚e approximative des boucles en millisecondes :

Minimum = 0ms, Maximum = 1ms, Moyenne = 0ms
de plus le temps de réponse avant affichage est de 3 à 4 secondes...trop long !!
J'ai donc essayé system()...
Code:
echo '<pre>';
$rsltPing = system('ping 192.168.1.1 -n 4');
echo '</pre>';
avec ce code, le ping s'affiche requête par requête (comme dans une fenêtre cmd), mais là encore impossible de 'françiser" les caractères...
Citation:
Envoi d'une requˆte 'ping' sur 192.168.1.1 avec 32 octets de donn‚esÿ:



R‚ponse de 192.168.1.1ÿ: octets=32 temps=1 ms TTL=64

R‚ponse de 192.168.1.1ÿ: octets=32 temps<1ms TTL=64

R‚ponse de 192.168.1.1ÿ: octets=32 temps<1ms TTL=64

R‚ponse de 192.168.1.1ÿ: octets=32 temps<1ms TTL=64



Statistiques Ping pour 192.168.1.1:

Paquetsÿ: envoy‚s = 4, re‡us = 4, perdus = 0 (perte 0%),

Dur‚e approximative des boucles en millisecondes :

Minimum = 0ms, Maximum = 1ms, Moyenne = 0ms
et la mise en page ne me conviens pas. En fait il me faudrait ceci comme présentation:
Citation:
Envoi d'une requête 'ping' sur 192.168.1.1 avec 32 octets de données:

Réponse de 192.168.1.1: octets=32 temps=1 ms TTL=64
Réponse de 192.168.1.1: octets=32 temps<1ms TTL=64
Réponse de 192.168.1.1: octets=32 temps<1ms TTL=64
Réponse de 192.168.1.1: octets=32 temps=1 ms TTL=64

Statistiques Ping pour 192.168.1.1:
Paquets: envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
Minimum = 0ms, Maximum = 1ms, Moyenne = 0ms
j'ai donc essayé ceci....
Code:
<?php
echo '<pre>';
exec('ping 192.168.1.1', $rsltPing);
for ($i = 0; $i < count($rsltPing); ++$i){
  $rsltPing[$i] = str_replace('ÿ','',$rsltPing[$i]);
  $rsltPing[$i] = str_replace('ˆ','ê',$rsltPing[$i]);
  $rsltPing[$i] = str_replace('‡','ç',$rsltPing[$i]);
  $rsltPing[$i] = str_replace('“','ô',$rsltPing[$i]);
  $rsltPing[$i] = str_replace(',','é',$rsltPing[$i]);
echo '</pre>'.$rsltPing[$i].'<br />';
}
?>
mais là encore si la mise en page est OK, les caractères ne me conviennent pas, ainsi que l'affichage d'un seul coup de la requête ping.
Les ',' contenues dans des mots ne sont pas modifiées, seules les virgules 'véritables' sont changées en 'é' !!! :evil:
Voici ce que ça donne...
Citation:
Envoi d'une requête 'ping' sur 192.168.1.1 avec 32 octets de donn‚es:

R‚ponse de 192.168.1.1: octets=32 temps=1 ms TTL=64
R‚ponse de 192.168.1.1: octets=32 temps<1ms TTL=64
R‚ponse de 192.168.1.1: octets=32 temps<1ms TTL=64
R‚ponse de 192.168.1.1: octets=32 temps<1ms TTL=64

Statistiques Ping pour 192.168.1.1:
Paquets: envoy‚s = 4é reçus = 4é perdus = 0 (perte 0%)é
Dur‚e approximative des boucles en millisecondes :
Minimum = 0msé Maximum = 1msé Moyenne = 0ms
Si un âme charitable connait une solution...même évidente :)

PS: je ne désire pas utiliser 'Net::Ping'...

Posté : 19 déc. 2007, 09:29
par titerm
Au vu du code que tu fournis, tu souhaites manifestement lancer ta commande ping en background.

exec() & system() ne sont donc pas adapté. Le temps d'attente dont tu te plaint est du au fait que la commande est forker mais le processus parent (le php) fait un wait. Tu devrais t'orienter vers proc_open() ou plus simple dans ton cas popen().

Posté : 19 déc. 2007, 12:40
par zest
Merci titerm,

J'ai essayé avec popen() :
<?php
$handle = popen('ping 192.168.1.1', 'r');
  while (!feof($handle)) {
    $read = fread($handle, 8192);
    echo $read.'<br />';
    }
fclose($handle);
?>
le résultat est identique à exec() au point de vu temps d'affichage...ça me donne:
Envoi d'une requˆte 'ping' sur 192.168.1.1 avec 32 octets de donn‚esÿ:
R‚ponse de 192.168.1.1ÿ:
octets=32
temps<1ms
TTL=64
R‚ponse de 192.168.1.1ÿ:
octets=32
temps<1ms
TTL=64
R‚ponse de 192.168.1.1ÿ:
octets=32
temps<1ms
TTL=64
R‚ponse de 192.168.1.1ÿ:
octets=32
temps<1ms
TTL=64
Statistiques Ping pour 192.168.1.1: Paquetsÿ: envoy‚s = 4, re‡us = 4, perdus = 0 (perte 0%),
Dur‚e approximative des boucles en millisecondes : Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms
le fonctionnement idéal pour moi, est avec system(), mais il semble impossible de contrôler la sortie....

Posté : 19 déc. 2007, 13:06
par titerm
Ma réponse concernant popen() était plus lié au pb de durée avant affichage. popen rend la main de suite, system ou exec non.

Ensuite, il faut savoir que php bufferrise les outputs. Soit tu dois faire un flush() dans ta boucle pour visualiser le résultat. Apache peut aussi bufferiser...

Re: affichage d'un 'ping' dans une page HTML

Posté : 19 déc. 2007, 16:51
par Ryle
Les ',' contenues dans des mots ne sont pas modifiées, seules les virgules 'véritables' sont changées en 'é' !!! :evil:
C'est très probablement parce que la virgule en question n'est pas une virgule 'véritable' et que le code ascii associé est différent de #044, qui est celui de notre virgule nationale. Le plus simple serait je pense de copier la virgule en question de ta fenêtre de commande et de la coller dans ton code.

Tu dois également pouvoir utiliser les fonctions de conversion ascii (ord()) pour identifier chaque caractère de la chaine et repérer le code de celui là afin de pouvoir le saisir...

Posté : 19 déc. 2007, 23:16
par zest
Merci Ryle,

En effet le code chr de cette 'virgule' est 130 !! :D
$val = str_replace(chr(130),'é',$val); 
et tout est OK coté caractères 'françisés'...reste l'affichage en temps rééls, style cmd.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

:? oups j'avais oublié de me logguer !!!

il me reste donc a trouver une méthode pour afficher le ping comme dans une boite de commande.
Pour répondre à Titerm, le fait que php ne me rende pas la main immédiatement n'est pas un problème.
Sur ma page web, il y a un champ (où sera saisi l'adresse IP) ,un bouton (le clic envoi la requête ping) et un textarea ou sera affiché le résultat (positif ou négatif) de la requête ping.
L'idéal serait que l'affichage s'effectue de la même manière que dans une fenêtre de commande (cmd)...du moins comme sous Windows :cry:
Il y aura 4 paquets envoyés.
J'aimerais bien afficher chaque requête/paquet une après l'autre...

Posté : 20 déc. 2007, 10:22
par h0_noMan
Essayes de mettre le resultat de la commande dans un fichier puis d'ouvrir le fichier après.
Comme ca tu gardes la meme mise en forme.
$rsltPing = exec("ping 192.168.1.1 >> ping.dat"); 
J'utilisais une methode similaire pour recuperer l'adresse MAC d'un ordinateur du reseau afin de faire correspondre le couple MAC/hostname a un enregistrement d'une table MySQL.

Posté : 20 déc. 2007, 12:16
par zest
Merci h0_noMan,

Effectivement c'est une bonne solution.
J'ai codé de cette façon:
<?php
exec('ping 10.12.19.254 >> ping.txt');
$fd = @fopen("ping.txt","r");
if (!$fd) die("Impossible d'ouvrir le fichier");
	$i=1;
	while (!feof($fd)) {
        $ligne = fgets($fd, 1024);
		$ligne = str_replace('ÿ','',$ligne);
		$ligne = str_replace('ˆ','ê',$ligne);
		$ligne = str_replace('‡','ç',$ligne);
		$ligne = str_replace('“','ô',$ligne);
		$ligne = str_replace(chr(130),'é',$ligne);
        if (!feof($fd)) echo $ligne."<br>";
        $i++;
    }
fclose($fd);
unlink("ping.txt");
?>
ce qui nous donne en sortie:
Envoi d'une requête 'ping' sur 10.12.19.254 avec 32 octets de données:

Réponse de 10.12.19.254: octets=32 temps=31 ms TTL=254
Réponse de 10.12.19.254: octets=32 temps=31 ms TTL=254
Réponse de 10.12.19.254: octets=32 temps=31 ms TTL=254
Réponse de 10.12.19.254: octets=32 temps=30 ms TTL=254

Statistiques Ping pour 10.12.19.254:
Paquets: envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes:
minimum = 30ms, maximum = 31ms, moyenne = 30ms
la mise en page et les caractères françisés sont donc OK... :D
Je vais chercher encore un peu (avec l'aide de tous :wink: ) pour avoir une sortie style cmd.

Posté : 20 déc. 2007, 12:59
par Ryle
J'ai pas bien compris si tu voulais afficher les résultats du ping en temps réel, ou seulement donner un effet, genre en javascript pour afficher ligne par ligne le résultat obtenu ?

Si c'est du "temps réel", ce que tu peux faire éventuellement en passant par un fichier, c'est utiliser ajax (ou même un bête script qui se réactualise dans une iframe, avec un méta refresh et un include) et afficher le contenu du fichier au fur et à mesure que le premier le génère...

Posté : 20 déc. 2007, 15:32
par Invité
Si c'est du "temps réel", ce que tu peux faire éventuellement en passant par un fichier, c'est utiliser ajax (ou même un bête script qui se réactualise dans une iframe, avec un méta refresh et un include) et afficher le contenu du fichier au fur et à mesure que le premier le génère...
c'est exactement ça...
Je fais un ping...et je veux un affichage en temps réel, ligne par ligne :wink:
Mais je ne maitrise pas 'trop' l'AJAX et 'méta refresh', je ne connais pas !!

Posté : 20 déc. 2007, 16:33
par h0_noMan
Si tu veux vraiment te rapprocher au mieux d'un temps reel.

Utilises un script de ping en PHP (avec les sockets)
http://www.planet-source-code.com/vb/sc ... 6&lngWId=8

Et de l'AJAX.

Posté : 20 déc. 2007, 17:49
par zest
Ok merci pour vos réponses

Mais là... :roll: l'Inglish c'est pô mon fort !!!
Prefère encore apprendre l'AJAX :wink:

http://www.manuelphp.com/php/sockets.intro.php

ça fait un peu long, pour de simple ping...mais bon !!

Posté : 07 janv. 2008, 16:12
par Invité
pour ce qui est des problèmes d'accent...

Code : Tout sélectionner

header ('Content-Type: text/html; charset=IBM850');
;)

Re: [Résolu] affichage d'un 'ping' dans une page HTML

Posté : 20 sept. 2019, 17:55
par Juan
Avec ce code il apparait à l'écran en temps réel le résultat du Ping

// Détermination Commande (Ping avec 5 boucles)
$commande = "ping -n 5 google.fr";

$listeDescripteur = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);

// Lancement du Processus
$ressourceProcessus = proc_open($commande, $listeDescripteur, $pipes, NULL, NULL);

// Si Processus bien lancé
if(is_resource($ressourceProcessus))
{
// Tant que le Processus écrit dans le Flux de Sortie ( le processus écrit dans les Pipes 1 et 2)
while( (($buffer = fgets($pipes[1], 1024)) != NULL) || (($errbuf = fgets($pipes[2], 1024)) != NULL))
{
// Si Contenu FLux Sortie Normal (stdout)
if(strlen($buffer)>0)
{
// Traitement Sortie Ecran
$affichageSortie = $buffer;
$affichageSortie = str_replace("‚","é",$affichageSortie);
$affichageSortie = str_replace("ˆ","ê",$affichageSortie);
$affichageSortie = str_replace("ÿ"," ",$affichageSortie);
$affichageSortie = str_replace("‡","ç",$affichageSortie);

// Affichage Sortie Ecran
echo "<br />".$affichageSortie; ob_flush(); flush();
}
// Fin - Si Contenu FLux Sortie Normal (stdout)


// Si Contenu FLux Sortie Erreur (strerr)
if (strlen($errbuf)>0) { echo "<br />ERR: " . $errbuf; ob_flush(); flush(); }
}
// Fin - Tant que le Processus écrit...

// Cloture des Pipes
foreach ($pipes as $pipeEnCours) { fclose($pipeEnCours); }

// Cloture Processus
proc_close($ressourceProcessus);

}
// Fin - Si Processus bien lancé
else echo "<br />Erreur Lancement Processus";