8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je suis actuellement en train de monter une page assez lourdes en information (à la demande du client). Le but est d'afficher tous ses produits ordonnées par famille et sous-famille (requête SQL), de traiter les informations et d'afficher en fonction des informations des blocs produits dynamiques. En tout, j'ai entre 600 et 800 produits a afficher.

Mon problème : J'ai un paramètre pour un produit qui est une chaine du type : 1;200g;0.2;2;300g;0.3 etc
On doit comprendre cette chaîne comme ceci :
Element 1, libelle 200g, coefficient multiplicateur de 0.2,
Element 2, libelle 300g, coefficient multiplicateur de 0.3,
etc

Si cette élement est NULL, je ne fais rien.
Si cette élement est différent de NULL, je fais ceci :

 //Vérification de l'existance d'une liste de découpe (utilsé pour la viande généralement)
         if($p['Parametresliste']['Contenu'] != ''){
                 //Tranformation de la chaine en tableau
                 $decoupe = explode(';', $p['Parametresliste']['Contenu']);
                 echo '<select>';
                 $i = 0;
                 //parcours du tableau (j'espère qu'avec ma description au dessus vous comprendrez le $i+3)
                while ($decoupe[$i] != '') {
                     echo '<option value="'.$decoupe[$i+2].'">'.$decoupe[$i+1].'</option>';
                     $i = $i+3;
                 }
                 echo '</select>';
         }


J'ai essayé ce même code avec un for et un count($decoupe) pour déterminer le nombre de tour à faire. J'ai un allow memory ...
J'ai essayé avec slip au lieu d'explode, ça ne change rien..

Pour conclure, si je n'utilise pas ce code, je mets 900ms a charger ma page (avec des images miniatures ultra compressées de 8 ko chacune (300ms sans images))

Voir ici sans la méthode

Par contre, avec cette méthode, je mets 9.76 secondes a charger ma page ! C'est énorme !

Voir ici avec la méthode

Pourquoi tant de temps ?

Si quelqu'un a une idée... merci d'avance.

EDIT : d'après les images que j'ai mis en lien, mon fichier principal pèse 7.9Mo avec la méthode et 290Ko sans, ... ! Smiley eek Alors là.. je ne comprend pas..
Modifié par Kikimagik (12 Mar 2014 - 11:33)
à quoi correspond la première ligne de la timeline ? Parce que ce qui me surprend c'est la différence juste énorme de poids.
Tu passes de 290ko à plus de 7mo. (ce qui justifie les 9 secondes)

Je suppose que c'est ton fichier php en lui-même et donc le poids de la page html au final.

Je doute qu'on puisse réellement optimiser ta requête, mais une pagination genre au bout de 20 ou 30 produits ne serait-il pas possible ? Parce que là, le soucis vient plus du fait que ton petit code rajoute ENORMEMENT de code html (et c'est pas un petit terme).
Modifié par Lothindil (12 Mar 2014 - 10:10)
Sur la base de 600 à 800 produits, seulement, aller... 50 vont avoir cette balise select. J'ai le résultat sous les yeux. Effectivement, les 9 secondes sont justifier par le poids de la page. Mais comment 50 balise select en plus peuvent faire monter le poids de la page aussi fortement !?

Surtout que entre nous, tout les produits possèdes une autre balise select (la quantité), TOUS ! Soit les 600 à 800 produits, et cela rentre dans le cas : chargement de la page sans la méthode --> 290ms

Tout ce qui peut faire augmenter le temps ou le poids, se sont les quelques lignes de code qu j'ai mis en haut.

Malheureusement, le principe ici est bien d'afficher tous les articles. Page de pagination possible.

Si ça peut aider, je travail avec Cakephp.

Mais merci de ta participation Lothindil Smiley smile
cakephp va pas m'aider, je fais une allergie (possiblement temporaire) aux framework ^^

Sinon, pour voir ce qui fait du poids sur la page, va voir le code source.

Tu as tenté de l'ôter, mais ça donne quoi quand tu n'éxécutes que lui dans ta boucle ? Il te produit quoi comme code source ?
Ok, j'ai trouvé le problème :

J'ai télécharger via le navigateur m'a page avec la méthode et sans la méthode.
Quand j'ai ouvert mon fichier htm sans la méthode, le code HTML était celui attendu --> un fichier de 290ko.

Par contre, avec la méthode, j'avais un fichier de plus de 7Mo, quand je l'ai ouvert... Olala :

$dataForView = array(
	'TousProduits' =&gt; array(
		(int) 0 =&gt; array(
			'Article' =&gt; array(
				[maximum depth reached]
			),
			'Tarif' =&gt; array(
				[maximum depth reached]
			),
			'Ssfamille' =&gt; array(
				[maximum depth reached]
			),
			'Famille' =&gt; array(
				[maximum depth reached]
			),
			'Unite' =&gt; array(
				[maximum depth reached]
			),
			'Parametresliste' =&gt; array(
				[maximum depth reached]
			)
		),
		(int) 1 =&gt; array(
			'Article' =&gt; array(
				[maximum depth reached]
			),
			'Tarif' =&gt; array(
				[maximum depth reached]
			),
			'Ssfamille' =&gt; array(
				[maximum depth reached]
			),
			'Famille' =&gt; array(
				[maximum depth reached]
			),
			'Unite' =&gt; array(
				[maximum depth reached]
			),
			'Parametresliste' =&gt; array(
				[maximum depth reached]
			)
		),
//etc jusqu’à 613 ! 


Le problème venait de ma condition d'arrêt du while.
Ne jamais comparer votre élément de sortie d'un tableau à chaîne vide !

Avec ce code, tous vas bien maintenant :

//Vérification de l'existance d'une liste de découpe (utilsé pour la viande généralement)
        if($p['Parametresliste']['Contenu'] != null){
                $decoupe = explode(';', $p['Parametresliste']['Contenu']);
                echo '<select>';
                $i = 0;
                while ($i < count($decoupe)) {
                    echo '<option value="'.$decoupe[$i+2].'">'.$decoupe[$i+1].'</option>';
                    $i = $i+3;
                }
                echo '</select>';
        }


Merci de ton aide Lothindil, c'est très sympa, en espérant pouvoir en aider d'autre.
Modifié par Kikimagik (12 Mar 2014 - 10:34)