Attention au catégories trop nombreuses

Réduire
X
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Attention au catégories trop nombreuses

    Chers amis, j'ai déja poser le problème (mais sans réponse ) sur le site de virtuemart, à savoir que lorsqu'on dépasse un certains nombres de catégories et sous catégories le back end de virtuemart débloque.
    Il devien impossible de lister les catégories ou même d'en créer de nouvelles.
    Le site rapporte une erreur de time limit auprès du serveur .
    en effet le php.ini de la plupart des serveurs mutualisé est règler de manière à éviter qu'un script tourne en boucle et ne bouffe toute la bande passante de l'hébergeur.


    Le problème apparait environs au bout de la 200 ème catégories et /ou sous catégories. le fait de modifier le time du php.ini (impossible en mutu , même avec un htaccess) ne résoud pas vraiment le problème car les catégories apparaissent effectivement mais au bout d'une minute voir 1.30 minutes. c'est extrêment long et génant pour travailler.
    Autre chose curieuse la liste des produits elle ne pose aucun problème, j'en ais actuellement 1560 et l'affichage se fait en 1à 2 secondes maxi, tandis qu'avec 465 catégories et sous catégories confondus le listing devien impossible .


    Avis aux amateur, le fichier product.product_category_list.php semble être en cause, si quelqu'un pouvait y jetter un oeuil cela en dépannerai plus d'un je pense , merci
    Fichiers joints
    Dernière édition par Asgard à 07/09/2006, 21h51
    Pas de demande de support en MP ou par mail, le forum est là pour ça!
    Joomla Ecommerce terminé grace à la communauté joomla , merci à tous. Maintenant je squate http://www.pc-tuning.fr
    http://www.mx-console.com
    http://www.alsace-boutique.fr prevu pour mars 2007

  • #2
    Effectivement Asgard, j'ai remarqué le même phenomène et c'est problématique.
    Le problème vient à mon avis du fait que le script est récursif. C'est-à-dire qu'il tourne en boucle car au départ il ne sait pas combien il existe de niveaux de sous-catégories.
    Il est possible que ce script ne soit pas correctement optimisé.

    Je n'ai trop le temps en ce moment de jeter un oeil à ce script donc si quelqu'un est dispo ...
    Freelance PHP LAMP
    http://www.nicolasfischer.com

    Commentaire


    • #3
      aucune réponse sur le forum virtuemart concernant ce problème , on dirait que ça ne les interessent pas, c'est pourtant quand même important, ça voudrait dire que virtuemart ne s'adresse qu'a de modeste boutiques, pour les plus importantes une solution alternative serait plus aproprié ?!
      Le pire c'est qu'ils ont déja eu le problème lorsqu'un type à mis 370 catégories sur leur boutique de démo, pour règler le souçi ils ont simplement diminué le nombre de catégories.

      C'est de la poudre aux yeux.....

      Pas de demande de support en MP ou par mail, le forum est là pour ça!
      Joomla Ecommerce terminé grace à la communauté joomla , merci à tous. Maintenant je squate http://www.pc-tuning.fr
      http://www.mx-console.com
      http://www.alsace-boutique.fr prevu pour mars 2007

      Commentaire


      • #4
        J'ai posté un début de solution qui semble marcher ici:
        http://virtuemart.net/index.php?opti...&topic=21452.0
        Travailler sur une table intermédiaire sans clef primaire est un abération, les index ne servent à rien (ou peu) sans elle. Cette modification n'altère pas les données si la table est clean dans la base. Faites quand même un export avant!

        Avec la base qu'Asgard m'a envoyé j'arrive donc à l'afficher en moins d'une minute. Sinon, j'ai localisé le code qui pose problème car MySQL n'est pas le seul en cause mais aussi une boucle PHP qui travaille sur des tableaux
        dans product.product_category_list.php à la ligne 59:

        Code:
        ...
        //[délai d'exécution jusqu'ici ~= 0.06 sec]
        59   while(count($id_list) < $nrows) {
        60       if( $loop_count > $nrows )
        ...          break;
                 $id_temp = array();          // tableau temporaire 1
                 $row_temp = array();         // tableau temporaire 2
                 $depth_temp = array();       // tableau temporaire 3
                 for($i = 0 ; $i < count($id_list) ; $i++) {
                     $id = $id_list[$i];
                     $row = $row_list[$i];
                     $depth = $depth_list[$i];
                     array_push($id_temp,$id);         // on met l'ID le numéro de la ligne dans le tableau 1
                     array_push($row_temp,$row);       // on met la ligne complète dans le tableau 2
                     array_push($depth_temp,$depth);   // on met l aprofondeur dans le tableau 3
                     for($j = 0 ; $j < $nrows ; $j++) {
                         if(($category_tmp[$j]["category_parent_id"] == $id)
                         && (array_search($category_tmp[$j]["category_child_id"],$id_list) == NULL)) {
                             array_push($id_temp,$category_tmp[$j]["category_child_id"]);
                             array_push($row_temp,$j);
                             array_push($depth_temp,$depth + 1);
                         }
                     }
                    
                 }
                 $id_list = $id_temp;
                 $row_list = $row_temp;
                 $depth_list = $depth_temp;
                 $loop_count++;
             }
        //[délai d'exécution jusqu'ici ~= 51.93 sec]
        pour un recordset de 351 enregistrements soit 0,1477... seconde par ligne traitée

        ATTENTION : les délais peuvent varier d'une machine à l'autre!
        J'ai commencé à analyser ce code mais il appelle un 4è tableau temporaire défini avant... une véritable usine à gaz!

        Vu l'heure (donc la fatigue), j'hésite à pousser plus loin pour l'instant. J'ai promis de m'y mettre lundi mais je risque d'être dérangé pour autre chose ce jour là.
        Donc à suivre.

        S'il y a un pro des arrays dans le coin ou un habitué des arbres récursifs, son aide sera la bienvenue!

        PS méthode de mesure
        Dans ce fichier, j'ai mis ces lignes:

        juste après les "require_once"
        Code:
        $time_start = microtime(true);
        puis celle-ci avant et après la boucle:
        Code:
        echo  microtime(true) - $time_start."<br />";
        Que la forge soit avec vous.

        Commentaire


        • #5
          Merci globule d'avoir travailler sur ce problème.

          Personnellement j'avais testé il y a quelques temps de lancer simplement la requête dans phpMyAdmin afin de voir le temps de réponse. Le résultat était apparau presque instantannément. Cela prouve que le problème ne vient pas de la requête SQL (qui est simple somme toute) mais bien de l'algorithme PHP qui se situe après.
          Celui-ci est récusrsif afin de créer l'arbre des catégories et comme tu dis il n'est pas optilmisé du tout.
          Je n'avais pas eu le temps de regarder plus en détails ... mais je vais peut-être y jeter un oeil début de semaine prochaine.
          Dernière édition par nfischer à 09/09/2006, 07h49
          Freelance PHP LAMP
          http://www.nicolasfischer.com

          Commentaire


          • #6
            ce qui est dingue également c'est que les dev de virtuemart mettent la tête dans le sable en ocultant le problème par une diminution des catégories sur le shop de démo

            merci les gars pour votre aide car je ne pense pas être le seul dans ce cas !!
            Pas de demande de support en MP ou par mail, le forum est là pour ça!
            Joomla Ecommerce terminé grace à la communauté joomla , merci à tous. Maintenant je squate http://www.pc-tuning.fr
            http://www.mx-console.com
            http://www.alsace-boutique.fr prevu pour mars 2007

            Commentaire


            • #7
              Envoyé par Asgard
              ce qui est dingue également c'est que les dev de virtuemart mettent la tête dans le sable en ocultant le problème par une diminution des catégories sur le shop de démo

              merci les gars pour votre aide car je ne pense pas être le seul dans ce cas !!
              Je te rappelle qu'ils laissent tomber Letterman (voir son forum). Et pourquoi à ton avis? Moi, je pense qu'il est parti réécrire Virtuemart pour Joomla 1.5 ...
              Un dev ne peut pas tout faire et l'esprit Open Source est basé sur la "contribution" c'est à dire aider les autres à resoudre leur problèmes.
              Dernière édition par globule à 09/09/2006, 12h24
              Que la forge soit avec vous.

              Commentaire


              • #8
                Envoyé par globule
                Je te rappelle qu'ils laissent tomber Letterman (voir son forum). Et pourquoi à ton avis? Moi, je pense qu'il est parti réécrire Virtuemart pour Joomla 1.5 ...
                Un dev ne peut pas tout faire et l'esprit Open Source est basé sur la "contribution" c'est à dire aider les autres à resoudre leur problèmes.
                oui je comprends parfaitement, mais partir sur une version complètement diférente alors que la première n'est pas finalisée c'est glucose
                espérons que la 1.5 permettra l'import du contenu de la 1.0.11
                Pas de demande de support en MP ou par mail, le forum est là pour ça!
                Joomla Ecommerce terminé grace à la communauté joomla , merci à tous. Maintenant je squate http://www.pc-tuning.fr
                http://www.mx-console.com
                http://www.alsace-boutique.fr prevu pour mars 2007

                Commentaire


                • #9
                  Je pense que tu n'as pas compris : ils considèrent (à mon avis) que c'est un bug "mineur" puisqu'il déjà répertorié depuis un moment et n'empêche pas le fonctionnement mais diminue simplement les performances. C'est aux utilisateur de choisir (ou non) virtuemart en connaissance de cause...
                  Il n'est d'ailleurs pas corrigé dans la 1.0.7 (dispo en beta), question de priorités.

                  Maintenant, si quelqu'un trouve une solution, il l'intégreront sans aucun doute.Mais il ne faut pas demander à un projet OpenSource des service de logiciels payant, c'est dans le copyright : "no warranty".

                  Pour la petite histoire, il m'est arrivé de trouver des bugs pour le compte d'un groupe pharmaceutique dans un logiciel payant d'un gros éditeur et une fois on m'a répondu "ce ne sera pas corrigé dans la prochaine version x.y, vous devez attendre la y.x et migrer". Et pourtant, ce bug empêchait l'utilisation d'une fonctionnalité indispensable à l'entreprise.
                  C'est un peu comme si on te disait : "il y a un bug dans Joomla 1.0.X qui ne gère pas correctement les dates de publication des articles, vous devez attendre la 1.5 et vous n'avez pas le droit de le corriger par vous-même sinon nous n'assurons plus de support du tout !".

                  Dans l'Open Source, si quelque chose ne te convient pas, tu es libre de le modifier. Ce qui constitue un avantage mais peut aussi être un inconvénient si tu ne sais pas le faire toi-même, comme dans ce cas. C'est pour cela qu'on cherche à te trouver une solution, pour le bien de tous les utilisateurs.
                  Que la forge soit avec vous.

                  Commentaire


                  • #10
                    Je viens de passer 3/4 d'heure dans le fichier product.product_category_list.php afin de décortiquer le code source qui pose problème. Maintenant j'ai compris pourquoi c'est tellement long.
                    Je n'ai pas trouver de solution pour corriger (je n'ai d'ailleurs pas regarder la totalité du fichier), mais ce qui est sur c'est que si tu as 300 catégories, ce fichier exécute 3 boucles sur ces 300 catégiories ce qui te donne une itération totale de 300 x 300 x 300 c'est-à-dire 27000000 !!
                    Au bout d'un moment chaque catégorie supplémentaire devient un vrai fardeau car c'est puissance 3 à chaque fois.

                    A priori je pense qu'il est possible d'optimiser, mais il faut passer un peu de temps dessus et tester pour être sur de ne rien casser.
                    Freelance PHP LAMP
                    http://www.nicolasfischer.com

                    Commentaire


                    • #11
                      Envoyé par nfischer
                      Je viens de passer 3/4 d'heure dans le fichier product.product_category_list.php afin de décortiquer le code source qui pose problème. Maintenant j'ai compris pourquoi c'est tellement long.
                      Je n'ai pas trouver de solution pour corriger (je n'ai d'ailleurs pas regarder la totalité du fichier), mais ce qui est sur c'est que si tu as 300 catégories, ce fichier exécute 3 boucles sur ces 300 catégiories ce qui te donne une itération totale de 300 x 300 x 300 c'est-à-dire 27000000 !!
                      Au bout d'un moment chaque catégorie supplémentaire devient un vrai fardeau car c'est puissance 3 à chaque fois.

                      A priori je pense qu'il est possible d'optimiser, mais il faut passer un peu de temps dessus et tester pour être sur de ne rien casser.
                      Il est clair que faire un arraysearch pour chaque catégorie nuie(nuit?) aux performances.
                      D'aileurs, pourquoi travailler sur 4 arrays alors qu'on a que 2 tables dans la requête?
                      Je pense que la première chose à faire est de définir les données de chaque array et l'usage qui en est fait.
                      Constat
                      après la requête, on a 1 seule array qui contient les id de cat et les id des parents
                      Question 1
                      Peux-t-on utiliser le tri multiple (multisort) pour obtenir le résultat voulu?
                      Question 2
                      Sinon, la scinder en 2 array (quite à rajouter un index pour tracer les correspondances), faire le tri sur l'array contenant seulement les id et fusionner les correspondances?
                      exemple:
                      array1 -> id + description
                      array2-> id+id parent+id ordre d'origine (correpondant à l'ordre de l'array1)
                      on peut ainsi triturer l'array 2 qui ne contient que des valeurs numériques (donc plus rapide) puis on récupère les descriptions correspondantes dans l'array1 grâce à l'id d'ordre d'origine donc sans faire une recherche mais en appelant directement le n° de ligne voulue.

                      Je n'ai pas mon ordi de test sous la main pour l'instant donc je ne pourrai le faire que lundi. Alors si quelqu'un m'a compris et pouvait le tester ce WE, ce serait bien...
                      Que la forge soit avec vous.

                      Commentaire


                      • #12
                        a la vache oui je comprend mieux maintenant !!

                        Globule te fache pas ce n'etait rien d'autre qu'un incompréhention de ma part
                        Pas de demande de support en MP ou par mail, le forum est là pour ça!
                        Joomla Ecommerce terminé grace à la communauté joomla , merci à tous. Maintenant je squate http://www.pc-tuning.fr
                        http://www.mx-console.com
                        http://www.alsace-boutique.fr prevu pour mars 2007

                        Commentaire


                        • #13
                          Envoyé par Asgard
                          a la vache oui je comprend mieux maintenant !!

                          Globule te fache pas ce n'etait rien d'autre qu'un incompréhention de ma part
                          Désolé si tu l'as mal pris, j'ai parfois du mal à prendre des pincettes, certians le savent depuis longtemps .
                          C'était juste pour te rappeler les principes.
                          Que la forge soit avec vous.

                          Commentaire


                          • #14
                            J'ai trouvé le hic : il veulent présenter les catégories triées par ordre alphabétique:

                            A
                            -AA
                            -AB
                            --ABA
                            --ABB
                            B
                            -BA
                            -BB
                            --BBA
                            --BBB

                            Ca va être chaud...
                            Que la forge soit avec vous.

                            Commentaire


                            • #15
                              Envoyé par globule
                              Je pense que tu n'as pas compris : ils considèrent (à mon avis) que c'est un bug "mineur" puisqu'il déjà répertorié depuis un moment et n'empêche pas le fonctionnement mais diminue simplement les performances. C'est aux utilisateur de choisir (ou non) virtuemart en connaissance de cause...
                              Il n'est d'ailleurs pas corrigé dans la 1.0.7 (dispo en beta), question de priorités.
                              Logique, plus de 200 catégories c'est exceptionnel...

                              Commentaire

                              Annonce

                              Réduire
                              1 sur 2 < >

                              C'est [Réglé] et on n'en parle plus ?

                              A quoi ça sert ?
                              La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

                              Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

                              Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
                              Comment ajouter la mention [Réglé] à votre discussion ?
                              1 - Aller sur votre discussion et éditer votre premier message :


                              2 - Cliquer sur la liste déroulante Préfixe.

                              3 - Choisir le préfixe [Réglé].


                              4 - Et voilà… votre discussion est désormais identifiée comme réglée.

                              2 sur 2 < >

                              Assistance au forum - Outil de publication d'infos de votre site

                              Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

                              Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

                              Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

                              UTILISER À VOS PROPRES RISQUES :
                              L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

                              Problèmes connus :
                              FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

                              Installation :

                              1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

                              Archive zip : https://github.com/AFUJ/FPA/zipball/master

                              2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

                              3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

                              4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

                              5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

                              6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
                              et remplacer www. votresite .com par votre nom de domaine


                              Exemples:
                              Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/
                              Pour executer le script: http://www..com/fpa-fr.php

                              Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/cms/
                              Pour executer le script: http://www..com/cms/fpa-fr.php

                              En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

                              Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
                              Voir plus
                              Voir moins
                              Travaille ...
                              X