Bonsoir,

Le 03/04/2012 16:59, Informatique Lycée Francois 1er a écrit :
Il y a quelques temps, j'ai posté un message concernant un problème de
lenteur lorsque l'on voulait visualiser la fiche de résumé d'un élève
(Consultation d'un élève -> Choix d'une classe -> Choix d'un élève).
J'ai depuis fait quelques recherches et pas mal de tests, et j'ai
finalement trouvé le fond du problème. Pour rappeler la configuration de
notre serveur GEPI, nous tournons chez OVH, et voici le résultat de la
page de test du serveur :


            Les données de base de votre serveur web :

    Le register_globals est à paramètre inconnu.

    Le serveur web est Apache/2.2.X (OVH)

    Encodage inconnu -> encodage par défaut : inconnu.

    Votre version de php est la 5.2.17 (Gepi nécessite php 5.2.x minimum).

    Votre version de serveur de base de données MySql est la 5.1.49-3-log.

    Votre version du module GD est la bundled (2.0.34
    compatible) (indispensable pour toutes les images).


    ------------------------------------------------------------------------


               Liste des modules implémentés avec votre php :

    PDO         Reflection      SPL     SQLite
    SimpleXML   bcmath  calendar        cgi
    ctype       curl    date    dba
    dbase       dom     exif    filter
    ftp         gd      gettext         gmp
    hash        iconv   imap    json
    libxml      mbstring        mcrypt  mhash
    ming        mysql   mysqli  openssl
    pcre        pdf     pdo_mysql       pdo_pgsql
    pdo_sqlite  pgsql   posix   pspell
    session     soap    sockets         standard
    sysvmsg     sysvsem         sysvshm         tokenizer
    wddx        xml     xmlreader       xmlrpc
    xmlwriter   xsl     zip     zlib


    ------------------------------------------------------------------------


            Les réglages php :

      * La mémoire maximale allouée à php est de 128M (/memory_limit/).
      * La taille maximum d'une variable envoyée à Gepi ne doit pas
        dépasser 64M (/post_max_size/).
      * Le temps maximum alloué à php pour traiter un script est de 120
        secondes (Cette valeur devrait suffire dans la grande majorité
        des cas) (/max_execution_time/).

    .......



Il semblerait que ce soit une partie bien précise du script PHP
".../eleves/visu_eleve.inc.php" qui pose problème. Après avoir désactivé
tous les affichages des onglets (à savoir "Onglet eleves", "Onglet
responsables", etc) en les mettant en commentaires dans le script, le
chargement de la page s'est fait normalement. Ce n'est qu'en les
réactivant un à un que j'ai pu constater qu'en dé-commentant le code
ci-dessous, le chargement de la page s’allongeait considérablement,
surtout pour les élèves ayant plusieurs bulletins (un par trimestre).
Ce bout de code se trouve à la ligne 1518 du fichier sous l'onglet
"bulletins". C'est celui qui calcule les moyennes sur les bulletins.

        for($loop=$periode1;$loop<=$periode2;$loop++) {
             $periode_num=$loop;
        include "../lib/calcul_moy_gen.inc.php";
        //$tab_moy_gen[$loop]=$moy_generale_classe;

        //======================================================================
        $tab_moy['periodes'][$periode_num]=array();
        
$tab_moy['periodes'][$periode_num]['tab_login_indice']=$tab_login_indice;
        // [$login_eleve]
        $tab_moy['periodes'][$periode_num]['moy_gen_eleve']=$moy_gen_eleve;
        // [$i]
        $tab_moy['periodes'][$periode_num]['moy_gen_eleve1']=$moy_gen_eleve1;
        // [$i]
        
//$tab_moy['periodes'][$periode_num]['moy_gen_classe1']=$moy_gen_classe1;
        // [$i]
        
$tab_moy['periodes'][$periode_num]['moy_generale_classe']=$moy_generale_classe;
        
$tab_moy['periodes'][$periode_num]['moy_generale_classe1']=$moy_generale_classe1;
        $tab_moy['periodes'][$periode_num]['moy_max_classe']=$moy_max_classe;
        $tab_moy['periodes'][$periode_num]['moy_min_classe']=$moy_min_classe;

        // Il faudrait récupérer/stocker les catégories?
        $tab_moy['periodes'][$periode_num]['moy_cat_eleve']=$moy_cat_eleve;
        // [$i][$cat]
        $tab_moy['periodes'][$periode_num]['moy_cat_classe']=$moy_cat_classe;
        // [$i][$cat]
        $tab_moy['periodes'][$periode_num]['moy_cat_min']=$moy_cat_min;
        // [$i][$cat]
        $tab_moy['periodes'][$periode_num]['moy_cat_max']=$moy_cat_max;
        // [$i][$cat]

        
$tab_moy['periodes'][$periode_num]['quartile1_classe_gen']=$quartile1_classe_gen;
        
$tab_moy['periodes'][$periode_num]['quartile2_classe_gen']=$quartile2_classe_gen;
        
$tab_moy['periodes'][$periode_num]['quartile3_classe_gen']=$quartile3_classe_gen;
        
$tab_moy['periodes'][$periode_num]['quartile4_classe_gen']=$quartile4_classe_gen;
        
$tab_moy['periodes'][$periode_num]['quartile5_classe_gen']=$quartile5_classe_gen;
        
$tab_moy['periodes'][$periode_num]['quartile6_classe_gen']=$quartile6_classe_gen;
        
$tab_moy['periodes'][$periode_num]['place_eleve_classe']=$place_eleve_classe;

        
$tab_moy['periodes'][$periode_num]['current_eleve_login']=$current_eleve_login;
        // [$i]
        //$tab_moy['periodes'][$periode_num]['current_group']=$current_group;
        if($loop==$periode1) {
        $tab_moy['current_group']=$current_group; // [$j]
        }
        
$tab_moy['periodes'][$periode_num]['current_eleve_note']=$current_eleve_note;
        // [$j][$i]
        
$tab_moy['periodes'][$periode_num]['current_eleve_statut']=$current_eleve_statut;
        // [$j][$i]
        //$tab_moy['periodes'][$periode_num]['current_group']=$current_group;
        $tab_moy['periodes'][$periode_num]['current_coef']=$current_coef; //
        [$j]
        
$tab_moy['periodes'][$periode_num]['current_classe_matiere_moyenne']=$current_classe_matiere_moyenne;
        // [$j]

        
$tab_moy['periodes'][$periode_num]['current_coef_eleve']=$current_coef_eleve;
        // [$i][$j] ATTENTION
        
$tab_moy['periodes'][$periode_num]['moy_min_classe_grp']=$moy_min_classe_grp;
        // [$j]
        
$tab_moy['periodes'][$periode_num]['moy_max_classe_grp']=$moy_max_classe_grp;
        // [$j]
        if(isset($current_eleve_rang)) {
        // $current_eleve_rang n'est pas renseigné si $affiche_rang='n'
        
$tab_moy['periodes'][$periode_num]['current_eleve_rang']=$current_eleve_rang;
        // [$j][$i]
        }
        $tab_moy['periodes'][$periode_num]['quartile1_grp']=$quartile1_grp;
        // [$j]
        $tab_moy['periodes'][$periode_num]['quartile2_grp']=$quartile2_grp;
        // [$j]
        $tab_moy['periodes'][$periode_num]['quartile3_grp']=$quartile3_grp;
        // [$j]
        $tab_moy['periodes'][$periode_num]['quartile4_grp']=$quartile4_grp;
        // [$j]
        $tab_moy['periodes'][$periode_num]['quartile5_grp']=$quartile5_grp;
        // [$j]
        $tab_moy['periodes'][$periode_num]['quartile6_grp']=$quartile6_grp;
        // [$j]
        $tab_moy['periodes'][$periode_num]['place_eleve_grp']=$place_eleve_grp;
        // [$j][$i]

        
$tab_moy['periodes'][$periode_num]['current_group_effectif_avec_note']=$current_group_effectif_avec_note;
        // [$j]
        //======================================================================

        }


Est ce que l'on peut optimiser ce code? Ou bien dois-je chercher la
solution autre part?

Je ne pense pas qu'il y ait grand chose à faire.

Sauf erreur, le SAV d'OVH parlait d'index manquants et de requêtes portant sur des liaisons de tables.
Est-ce qu'une mise à jour de la base arrange des choses?


Les seules requêtes présentant des jointures sont:


$sql="SELECT e.* FROM eleves e, j_eleves_classes c
        WHERE (
        e.login = c.login and
        c.id_classe = '".$id_classe."' and
        c.periode='".$periode_num."'
        )
        ORDER BY e.nom, e.prenom";

et une des deux suivantes selon que l'on utilise ou non les catégories:

$sql="SELECT DISTINCT jgc.id_groupe, jgc.coef, jgc.categorie_id, jgc.mode_moy ". "FROM j_groupes_classes jgc, j_groupes_matieres jgm, j_matieres_categories_classes jmcc, matieres m, matieres_categories mc " .
        "WHERE ( " .
        "mc.id=jmcc.categorie_id AND ".
        "jgc.categorie_id = jmcc.categorie_id AND " .
        "jgc.id_classe=jmcc.classe_id AND " .
        "jgc.id_classe='".$id_classe."' AND " .
        "jgm.id_groupe=jgc.id_groupe AND " .
        "m.matiere = jgm.id_matiere " .
"AND jgc.id_groupe NOT IN (SELECT id_groupe FROM j_groupes_visibilite WHERE domaine='bulletins' AND visible='n')".
        ") " .
        "ORDER BY jmcc.priority,mc.priority,jgc.priorite,m.nom_complet";
        calc_moy_debug($sql."\n");
        $appel_liste_groupes = mysql_query($sql);

ou


$sql="SELECT DISTINCT jgc.id_groupe, jgc.coef, jgc.mode_moy
        FROM j_groupes_classes jgc, j_groupes_matieres jgm
        WHERE (
        jgc.id_classe='".$id_classe."' AND
        jgm.id_groupe=jgc.id_groupe
AND jgc.id_groupe NOT IN (SELECT id_groupe FROM j_groupes_visibilite WHERE domaine='bulletins' AND visible='n')
        )
        ORDER BY jgc.priorite,jgm.id_matiere";
        calc_moy_debug($sql."\n");
        $appel_liste_groupes = mysql_query($sql);



Cordialement.
--
Stephane Boireau
Collège Le Hameau - Bernay (27)
http://stephane.boireau.free.fr/gadgets/crobards.html
_________________________________________________________________________________
Documentation Gepi en ligne : http://www.sylogix.org/projects/gepi/wiki
Pour modifier ou résilier votre abonnement à cette liste :
https://lists.sylogix.net/mailman/listinfo/gepi-users

Répondre à