Bonjour à tous,
J'avais initialement posté dans la rubrique AJAX, car je pensais que le pb venait de là...
Mais en fait, en testant sur une simple page php sans appel AJAX, j'obtiens également, au bout de 75 secondes environ, une page blanche (pas d'erreur, mais time out je suppose) en guise de résultat du traitement PHP/MySQL de mes qq 60000 enregistrements ! Et là je suis mal car je ne sais pas comment améliorer ce traitement.
Donc :
Le résultat de mon script donne une liste structurée (avec arborescence sur 3 niveaux : catégories/sous-catégories/sous-sous-catégories) de mes enregistrements que j'explose via des boucles While successives :
-> CatégorieA
-> Sous-catégorie1 (appartenant à CatégorieA)
-> Sous-sous-catégorieA (appartenant à Sous-catégorie1)
-> Enregistrement1 (appartenant à Sous-sous-catégorieA)
-> Enregistrement2 (appartenant à Sous-sous-catégorieA)
-> Enregistrement3 (appartenant à Sous-sous-catégorieA)
-> Sous-sous-catégorieB (appartenant à Sous-catégorie1)
-> Enregistrement4 (appartenant à Sous-sous-catégorieB)
-> Enregistrement5 (appartenant à Sous-sous-catégorieB)
-> Enregistrement6 (appartenant à Sous-sous-catégorieB)
-> Sous-catégorie2 (appartenant à CatégorieA)
-> Sous-sous-catégorieC (appartenant à Sous-catégorie2)
-> Enregistrement7 (appartenant à Sous-sous-catégorieC)
-> Enregistrement8 (appartenant à Sous-sous-catégorieC)
-> Enregistrement9 (appartenant à Sous-sous-catégorieC)
-> Sous-sous-catégorieD (appartenant à Sous-catégorie2)
-> Enregistrement10 (appartenant à Sous-sous-catégorieD)
-> Enregistrement11 (appartenant à Sous-sous-catégorieD)
-> Enregistrement12 (appartenant à Sous-sous-catégorieD)
...etc.
-> CatégorieB
-> Sous-catégorie3 (appartenant à CatégorieB)
-> Sous-sous-catégorieE (appartenant à Sous-catégorie3)
-> Enregistrement13 (appartenant à Sous-sous-catégorieE)
-> Enregistrement14 (appartenant à Sous-sous-catégorieE)
-> Enregistrement15 (appartenant à Sous-sous-catégorieE)
-> Sous-sous-catégorieF (appartenant à Sous-catégorie3)
-> Enregistrement16 (appartenant à Sous-sous-catégorieF)
-> Enregistrement17 (appartenant à Sous-sous-catégorieF)
-> Enregistrement18 (appartenant à Sous-sous-catégorieF)
-> Sous-catégorie4 (appartenant à CatégorieB)
-> Sous-sous-catégorieG (appartenant à Sous-catégorie4)
-> Enregistrement19 (appartenant à Sous-sous-catégorieG)
-> Enregistrement20 (appartenant à Sous-sous-catégorieG)
-> Enregistrement21 (appartenant à Sous-sous-catégorieG)
-> Sous-sous-catégorieH (appartenant à Sous-catégorie4)
-> Enregistrement22 (appartenant à Sous-sous-catégorieH)
-> Enregistrement23 (appartenant à Sous-sous-catégorieH)
-> Enregistrement24 (appartenant à Sous-sous-catégorieH)
...etc.
...etc.
Sachant qu'il y a 7 catégories, comprenant chacune env. 9 sous-catégories, lesquelles comprenant chacune env. 12 sous-sous-catégories, lesquelles comprenant chacune env. 80 enregistrements
On obtient donc mes 7 x 9 x 12 x 80 = env. 60000 enregistrements dans ma BDD.
En PHP ça donne ça, en version simplifiée :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
$req1 = "SELECT id_categorie, numero_categorie, nom_categorie FROM table_categories ORDER BY numero_categorie ASC";
$res1 = mysql_query($req1) or die(mysql_error());
echo '<ul id="niveau1">';
while ($enr1 = mysql_fetch_array($res1)) {
$IDCATEG = $enr1['id_categorie'];
$CATEG = $enr1['numero_categorie']." - ".$enr1['nom_categorie'];
echo '<li>'.$CATEG.
'<ul id="niveau2">';
$req2 = "SELECT id_sous_categorie, numero_sous_categorie, nom_sous_categorie FROM table_sous_categories WHERE id_categorie LIKE ".$IDCATEG." ORDER BY numero_sous_categorie ASC";
$res2 = mysql_query($req2) or die(mysql_error());
while ($enr2 = mysql_fetch_array($res2)) {
$IDSOUSCATEG = $enr2['id_sous_categorie'];
$SOUSCATEG = $enr2['numero_sous_categorie']." - ".$enr2['nom_sous_categorie'];
echo '<li>'.$SOUSCATEG.
'<ul id="niveau3">';
$req3 = "SELECT id_sous_sous_categorie, numero_sous_sous_categorie, nom_sous_sous_categorie FROM table_sous_sous_categories WHERE id_sous_categorie LIKE ".$IDSOUSCATEG." ORDER BY numero_sous_sous_categorie ASC";
$res3 = mysql_query($req3) or die(mysql_error());
while ($enr3 = mysql_fetch_array($res3)) {
$IDSOUSSOUSCATEG = $enr3['id_sous_categorie'];
$SOUSSOUSCATEG = $enr3['numero_sous_sous_categorie']." - ".$enr3['nom_sous_sous_categorie'];
echo '<li>'.$SOUSSOUSCATEG.
'<ul id="listage">';
$req4 = "SELECT champ1, champ2, champ3 FROM ma_table WHERE id_sous_sous_categorie LIKE ".$IDSOUSSOUSCATEG." ORDER BY champ1 ASC";
$res4 = mysql_query($req4) or die(mysql_error());
while ($enr4 = mysql_fetch_array($res4)) {
$CHAMP1= $enr4['champ1'];
$CHAMP2= $enr4['champ2'];
$CHAMP3= $enr4['champ3'];
echo '<li>'.$CHAMP1.' - '.$CHAMP2.' - '.$CHAMP3.'</li>';
}
mysql_free_result($res4);
echo '</ul></li>';
}
mysql_free_result($res3);
echo '</ul></li>';
}
mysql_free_result($res2);
echo '</ul></li>';
}
mysql_free_result($res1);
echo '</ul>'; |
J'ai donc 4 boucles While imbriquées qui parcourent chacune des milliers d'enregistrements, ça fait lourdingue !
Le site est hébergé chez 1and1, et apparemment on a la main sur pas mal de paramétrages via php.ini. Donc j'ai ajouté dans ce php.ini les paramètres suivants :
memory_limit=-1
max_execution_time=600
mysql.connect_timeout=600
Mais ça coince toujours !
J'ai aussi pris soin de mettre des clés primaires sur mes id uniques de champs, et des index sur les clés étrangères dans mes différentes tables.
Je suis perplexe...
Et je vous le dis tout de suite : oui, il est nécessaire de pouvoir afficher l'intégralité de ces enregistrements, même si ça vous paraît saugrenu, et même si la plupart du temps l'utilisateur applique un filtre (par catégorie ou sous-catégorie) - d'ailleurs lorsqu'un tel filtre est appliqué à la requête, elle fonctionne parfaitement, ça prend qd même une vingtaine de secondes mais pas de pb de timeout car cela concerne au maximum 10000 enregistrements.)
Le pire c'est que, il y a qq années, j'avais réalisé la même appli mais sous Access 97 et Visual Basic, avec les mêmes structures de requêtes, et ça tournait super bien avec le même volume d'enregistrements, alors je l'ai un peu mauvaise de constater que Access 97/VB serait plus puissant que mon couple préféré PHP/MySQL !!!
Où alors j'ai raté un truc d'optimisation ou de paramétrage...
Merci d'avance si vous avez des idées !
Partager