Bonjour,

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

Ce que je fais

J'utilise XAMPP, sur un serveur dédier.
Mon script fonctionne parfaitement, mais il est long à charger, en local ou à distance.

Ce que je veux

Est-il possible en quelques sorte de "pré-charger" mon code sur ce serveur, avec une réactualisation toutes les heures par exemple, pour que dés que je me connecte à distance la page se charge en quelques secondes.

Merci d'avance.

14 réponses


Je ne suis renseigner pour un systeme de cache, mais je t'avourais que je galere à comprendre comment le mettre en place.
Et pour "cron" je ne connais pas du tout.
Peux-tu m'en dire plus?

Merci

Hello,
ton code fait quoi ?
peut-être y-a t-il une autre manière de faire qui accélèrera les choses ?

Je vais essayer d'être clair.
Ma page affiche la carte d'un departement, sur cette carte se trouve des points (45) situer a des endroits bien précis.
Le points à 2 états : vert -> Tous les serveurs sont OK
rouge -> Au moins 1 serveur est KO
Il y a environ 500 serveurs au total.
Depuis "index.php" les points sont appeller car la commande :

   <div id='Serveur 1'>
   <?php include('points/Serveur1.php'); ?>
   </div>

Dans le fichier "Serveur1.php" on trouve ce code :

<?php
$hs = false;
$hosts1 = file ("Serveur1/list1.txt");
$hosts2 = file ("Serveur1/list2.txt");
$hosts = array_merge ($hosts1 , $hosts2);
foreach ($hosts as $host) {
  $ping = exec("ping -n 1 {$host}");
  if ( substr($ping, -2) != 'ms') {
    $hs = true;
    break;
  }
}
echo "<td width=60><a href='Site1/Serveur1.php'><img src=/". ($hs ? "rouge.gif" : "vert.gif") ."></a></td>";
?>

Ce code fonctionne parfaitement.
Le probléme c'est que lors du chargement il doit pinger environ 500 serveurs et le temps qu'il affiche les resultats sont trés long.
Merci d'avance

Le lien vers la page permet d'avoir l'état des serveurs un par un sur une nouvelle page.
Ton idée de faire des cron à l'ai vraiment se que je recherche mais je suis novice dans la programmation et je ne connais pas du tout la maniere de procéder.
Est-il possible, pour ne pas encombrer le forum, de te parler par mail ou message privé pour que tu me donne certaines bases pour mon projet?
Merci beaucoup

Ce que tu me décris est exactement se que j'aimerais mettre en place.
Mais la dans l'état actuel je n'arriverais jamais à le faire.
Peux tu m'aider à faire tout cela?

Merci pour ces informations super utile.
J'ai reussis à le faire fonctionné pour une région.
Il m'idique se que je veux. Etat serveur par serveur ainsi que KO si un seul serveur HS, et OK si tout les serveurs OK.
Comment je pourrais faire pour qu'en fonction du resutat de "statut région {$region}" il me mette une image "vert.gif" si OK ou "rougeclignote.gif" si KO, ainsi que rendre cette image cliquable (comme tu la fait avec "a href").

Merci

$serveurs = array();
$i = 0;

// chargement du fihcier dans un tableau multi dimentionnel
$fp = @fopen("serveurs.csv", "r");
if ($fp) {
    while (($data = fgetcsv($fp, 512, ';')) !== false) {
        if ($i == 0) { // ignore entete
                $i++;
                continue;
        }
        // structure du tableau : region => statut / liste => statut / ip => statut
        if (!array_key_exists($data[0], $serveurs))
                $serveurs[$data[0]] = array('statut' => 'OK', 'liste' => array());
        if (!array_key_exists($data[1], $serveurs[$data[0]]['liste']))
                $serveurs[$data[0]]['liste'][$data[1]] = array('statut' => '<img src=/vert.gif>', 'ip' => array());

        $serveurs[$data[0]]['liste'][$data[1]]['ip'][$data[2]] = $data[3];
        if ($data[3] == "HS") {
                $serveurs[$data[0]]['statut'] = "<img src=/". ("rougeclignote.gif") .">";
                $serveurs[$data[0]]['liste'][$data[1]]['statut'] = "<img src=/". ("rougeclignote.gif") .">";
        }
    }
    if (!feof($fp)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($fp);
}

// récupération d'info dans l'url pour filtrer
$p_region = isset($_GET['region']) ? $_GET['region'] : "";
$p_liste = isset($_GET['liste']) ? $_GET['liste'] : "";

// parcours du tableau
foreach($serveurs as $region => $info) {
        if (!empty($p_region) && ($p_region != $region)) continue; // si pas la région indiquée, on saute la boucle
        echo "<div id='{$region}'>";
        echo "<p>{$region} : <a href='index.php?region={$region}'>{$info['statut']}</a></p>";

        foreach($info['liste'] as $liste => $detail) {
                if (!empty($p_liste) && ($p_liste != $liste)) continue; // si pas la liste indique, on saute la boucle
                echo "<ul>{$liste} : <a href='index.php?region={$region}&liste={$liste}'>{$detail['statut']}</a></li><ul>";
                foreach($detail['ip'] as $ip => $statut)
                        echo "<li>{$ip} : {$statut}</li>";
                echo "</ul></ul>";
        }
        echo "</div>";
}
?>

J'ai trouvé.
Par contre je ne sais pas comment utiliser cette image pour la mettre ou je veux sur une autre page php.
Exemple : Dire sur une autre page php que je veux le resultat global de la region 1 liste 1, puis sur une autre page region1 liste 2......
Merci

J'ai remis comme tu me l'avais dit précédemment.
Avec le commun.php cela fonctionne parfaitement.
Maintenenant pour la ligne :

echo "<a href='[lien]'><img src='". ($info['statut'] == "HS" ? "rougeclignote.gif" : "vert.gif") ."' /></a>";

Je la met ou exactement?
Dans mon fichier "serveurs.csv" pour le moment il n'y aura que une region et dans cette regions 45listes et dans une liste les X serveurs.

Car j'aimerais mettre juste le resultat globale(vert ou rouge) de la liste 1 dans une page à part et le faire pour les 45 listes differentes.

Merci

Bon je n'arrive pas a "couper" le tableau et a mettre la reponse globale de chaque liste dans plusieurs pages différentes.
J'arrive a mettre toutes les reponses cote à cote mais pas comme je le veux.

Super, j'ai reussis et tout fonctionne.
Maintenant j'aimerais utiliser ton premier fichier "index.php" et n'afficher que les tableaux HS.
Donc quel ligne enlever pour cela?

Et pourquoi pas faire un petit pourcentage de serveur OK.
J'ai vu ce code :

<?php
    $nombre_serveur_ok = 400;
    $total_serveurs=500;
    $valeur_p = 100;
    echo cacul_pourcentage($nombre_serveur_ok,$total_serveurs,$valeur_p)." %";
?>

Mais comment l'appliquer pour aficher le pourcentage de serveur OK?
Car le nombre de serveur ok est variable de jour en jour.
Merci

Génial comme d'habitude.
Autre question :
Est-il possible d'utiliser une variable dans une infobulle?

$serveurs[$data[0]]['liste'][$data[1]]['statut'] = '<img src=/rougeclignote.gif title="$info[nb_HS]">';

J'ai reussis à mettre une infobulle mais j'aimerais qu'il m'indique du nombre de serveur HS dans chaque liste quand je vais dessus avec ma souris.

Ok bon se n'est pas grave juste une info en plus.
Comment tu peux faire pour afficher uniquement les serveurs HS en prenant en reference le "index.php" que tu ma donné?

Super mon infobulle indique le nombre de serveur HS.
Maintenant une dernier question sur ce sujet:
j'ai le fichier commun.php

<?php
$serveurs = array();
$i = 0;

// chargement du fihcier dans un tableau multi dimentionnel
$fp = @fopen("serveurs.csv", "r");
if ($fp) {
    while (($data = fgetcsv($fp, 512, ';')) !== false) {
        if ($i == 0) { // ignore entete
                $i++;
                continue;
        }
        // structure du tableau : region => statut / nb_OK / nb_HS / liste => statut / nb_OK / nb_HS / ip => statut
        if (!array_key_exists($data[0], $serveurs))
                $serveurs[$data[0]] = array('statut' => 'OK', 'nb_OK' => 0, 'nb_HS' => 0, 'liste' => array());
        if (!array_key_exists($data[1], $serveurs[$data[0]]['liste']))
                $serveurs[$data[0]]['liste'][$data[1]] = array('statut' => '<img src=/vert.gif>', 'nb_OK' => 0, 'nb_HS' =>0, 'ip' => array());

        $serveurs[$data[0]]['liste'][$data[1]]['ip'][$data[2]] = $data[3];
        $serveurs[$data[0]]['nb_OK']++;
        $serveurs[$data[0]]['liste'][$data[1]]['nb_OK']++;
        if ($data[3] == "HS") {
                $serveurs[$data[0]]['statut'] = "<img src=/". ("rougeclignote.gif") .">";
                $serveurs[$data[0]]['nb_HS']++;
                $serveurs[$data[0]]['liste'][$data[1]]['statut'] = "<img src=/rougeclignote.gif>";
                $serveurs[$data[0]]['liste'][$data[1]]['nb_HS']++;
        }
    }
    if (!feof($fp)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($fp);
}
?>

Avec l'index.php

include("commun.php");
// récupération d'info dans l'url pour filtrer
$p_region = isset($_GET['region']) ? $_GET['region'] : "";
$p_liste = isset($_GET['liste']) ? $_GET['liste'] : "";

// parcours du tableau
foreach($serveurs as $region => $info) {
        if (!empty($p_region) && ($p_region != $region)) continue; // si pas la région indiquée, on saute la boucle
        echo "<div id='{$region}'>";
        echo "<p>{$region} : <a href='index.php?region={$region}'>{$info['statut']}</a></p>";

        foreach($info['liste'] as $liste => $detail) {
                if (!empty($p_liste) && ($p_liste != $liste)) continue; // si pas la liste indique, on saute la boucle
                echo "<ul>{$liste} : <a href='index.php?region={$region}&liste={$liste}'>{$detail['statut']}</a></li><ul>";
                foreach($detail['ip'] as $ip => $statut)
                        echo "<li>{$ip} : {$statut}</li>";
                echo "</ul></ul>";
        }
        echo "</div>";
}

Avec ce index.php il me donne la region et dans les regions la liste des serveurs OK et HS, c'est parfait, mais j'aimerais afficher uniquement les HS et enlever completement les OK.
Je n'arrive pas a trouver la solution.
Merci d'avance

Voila je reviens pour vous anoncer que j'ai reussi(enfin une grosse partie).
J'ai certaine adresse qui ont un nom et d'autre non.
exemple :
192.168.0.1 : Serveur 1
192.168.0.2 : Serveur 2
192.168.0.3
192.168.0.4 : serveur 3
........
J'ai rajouter dans mon serveurs.csv le nom dans un nouvelle colonne appeller "machine".
maintenant je n'arrive pas a rajouter cette colonne dans mon commun.php

<?php
$serveurs = array();
$i = 0;

// chargement du fihcier dans un tableau multi dimentionnel
$fp = @fopen("serveurs.csv", "r");
if ($fp) {
    while (($data = fgetcsv($fp, 512, ';')) !== false) {
        if ($i == 0) { // ignore entete
                $i++;
                continue;
        }
        // structure du tableau : region => statut / nb_OK / nb_HS / liste => statut / nb_OK / nb_HS / ip => statut
        if (!array_key_exists($data[0], $serveurs))
                $serveurs[$data[0]] = array('statut' => 'OK', 'nb_OK' => 0, 'nb_HS' => 0, 'liste' => array());
        if (!array_key_exists($data[1], $serveurs[$data[0]]['liste']))
                $serveurs[$data[0]]['liste'][$data[1]] = array('statut' => '<img src=/vert.gif>', 'nb_OK' => 0, 'nb_HS' =>0, 'ip' => array());

        $serveurs[$data[0]]['liste'][$data[1]]['ip'][$data[2]] = $data[3];
        $serveurs[$data[0]]['nb_OK']++;
        $serveurs[$data[0]]['liste'][$data[1]]['nb_OK']++;
        if ($data[3] == "HS") {
                $serveurs[$data[0]]['statut'] = "<img src=/". ("rougeclignote.gif") .">";
                $serveurs[$data[0]]['nb_HS']++;
                $serveurs[$data[0]]['liste'][$data[1]]['statut'] = "<img src=/". ("rougeclignote.gif") .">";
                $serveurs[$data[0]]['liste'][$data[1]]['nb_HS']++;  
        }
    }
    if (!feof($fp)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($fp);
}
?>

Quel ligne est a rajouter pour que je puisse l'utiliser dans mon fichier "serveurHS.php"

<?php
include("commun.php");
// récupération d'info dans l'url pour filtrer
$p_region = isset($_GET['region']) ? $_GET['region'] : "PSE";
$p_liste = isset($_GET['liste']) ? $_GET['liste'] : "";

// parcours du tableau
foreach($serveurs as $region => $info) {
        if (!empty($p_region) && ($p_region != $region)) continue; // si pas la région indiquée, on saute la boucle
        echo "<div id='{$region}'>";

        foreach($info['liste'] as $liste => $detail) {
                if (!empty($p_liste) && ($p_liste != $liste)) continue; // si pas la liste indique, on saute la boucle
                if ($detail['statut'] == "<img src=/". ("rougeclignote.gif") .">")
                {
                echo "<ul><a href='serveur/$liste.php'>{$liste}</a></li><ul>";
                }
                foreach($detail['ip'] as $ip => $statut)
                if ($statut == "HS")
                {
                echo "<li>{$ip}</li>";
                }
                echo "</ul></ul>";
        }
        echo "</div>";
}
?>

Il fonctionne parfaitement mais j'aimerais mettre son nom a coter de {$ip}.
Merci d'avance.