Je cherche une solution moin lourde - PHP => requete de ping

Bonjour,

Je cherche a faire une page sur mon intranet technique qui verifi que tout nos serveurs sont joignable (en interne ou vers l’xterieur).

J’ai donc une trés courte fonction avec un “exec” qui renvoit TRUE ou FALSE selon le nombre de ligne retournée par la commande.

je trouve sa interressant mais excessivement long, je fait des test actuellement avec 2-3 serveur a pinger et c’est deja trop long (alors iumaginons 50 serveurs (timout assurés).

Je place donc tout les noms et ip des serveurs dans un array
je parcour ce tableau de 0 a count($array)
si le ping du nom marche pas, je ping l’ip
je place le resultat dans ce meme tableau

Si quelqu’un a une meilleur solution ça m’aiderai bcp

Merci

tu démarre ça en ligne de commande, ça sera plus simple et t’évitera le timeout, tu crois pas?

Pour la longueur, tu peux essayer du côté de http://fr.php.net/manual/fr/function.fsockopen.php pour juste voir si le serveur est là ou non. Ceci étant, ça peut quand même être lent malgré tout.

Sinon, le exec() doit pas être rapide non plus…

Je n’ai fait que d’entendre parler (je n’ai jamais appliquer) mais ceci pourrait peut-être résoudre tes problèmes: l’utilisation du multithreading avec PHP. L’idée c’est d’envoyer un ping à tous tes serveurs en même temps. Comme ça pas de problème! Le temps maximal est le temps que prend le ping le plus lent.
Et sinon pour les time-out je crois que Sans-nom t’as donné la solution (je sais pas si on peut empêcher les time-out sur des page générée en PHP accessible depuis le web via PHP.INI).

Je te laisser chercher sur l’ami google :slight_smile: , si tu trouves pas je regarderai.

EDIT: http://www.atelierphp5.com/multi-threading-en-php.html
Une bonne illustration trouvée sur cette page (A étant le ping au premier serveur et B le ping au deuxième, tu peux bien sûr rajouter autant de ‘lettre’ et donc de serveur que tu veux):
http://www.atelierphp5.com/images/multi_thread.gif

Sinon tu peux faire une page html qui interroge successivement le script php avec chaque serveur (soit avec AJAX, soit avec une iframe), et affiche les résultats au fur et à mesure. Ça sera toujours long, mais ça évite les timeout et ça rend l’attente un peu moins perceptible (vu que les résultats s’affichent progressivement).

Merci pour vos réponses

Je vais essayer de faire du multithreading, sa à l’air un peu compliquer (je débute en php) mais bon.

Si non en faisant des iframes qui appelent toutes la même page sa chargera toutes les iframes en même temps:
genre je pourrais faire une page ping qui test la disponibilité de $_GET[$nom]
et j’appelle chaque iframe par:
ping.php?nom=machine1
ping.php?nom=machine2
ping.php?nom=machine3

si je fait comme sa comment je peut réoccuperer le résultat dans ma page principale? (peu être créer un champ temporaire dans MySQL? mais la page principale sera chargé avant les ifram, donc je suppose que NON)

Merci

Pour ça, l’idéal serait que la page ping.php renvoie un javascript, qui transmet les résultats à la page principal.

Du genre, pour la page principale :

HTML
<html>

<head>
<script type="text/javascript">

function traiterDonnees(serveur, ping)
{

//Traitement et affichage des données

}
</script>
</head>
<body>
<iframe src="ping.php?nom=machine1" frameborder="0" width="0" height="0"></iframe>
<iframe src="ping.php?nom=machine2" frameborder="0" width="0" height="0"></iframe>
</body>
</html>

Et dans ping.php :


<?php

//Code effectuant le ping

?>

<script type="text/javascript">

parent.traiterDonnees('<?php echo $server?>','<?php echo $ping?>');

</script>


Ainsi, quand le ping est terminé, le javascript est envoyé à l’iframe avec les données, l’iframe exécute le javascript qui remonte les données vers la page principale, qui elle même n’a plus qu’à traiter le tout :slight_smile:

Il faudrait vérifier que PHP ne traite pas une page après l’autre (et donc une iframe après l’autre) parce que ça sert à rien de se lancer dans ce projet si ça marche pas.

Vérifie avant :wink: (je suis pas sur mais je crois que j’ai entendu dire des personnes que le traitement de PHP s’effectuait une page après l’autre, pas dans l’article du multithreading que je t’ai donné d’ailleurs?).

Hum,

Au passage : http://fr.php.net/manual/fr/function.set-time-limit.php

Tout ca est fastidieux et lent.
J’ai eu la meme chose a faire et je l’ai fait avec LabVIEW.
Resultat:
Hypertreading activé tres simplement, donc un ping sur plusieurs dizaines de serveurs pour un temps egal au plus long des pings.
C’est a dire en 5 à 8 secondes j’ai interogé pleins de machines.
Et avec le serveur LabVIEW, j’ai une image sur mon serveur local.
L’ideal…