eprems Posted September 30, 2013 Share Posted September 30, 2013 Bonjour, Ma santé va bien... enfin jusqu'à ce que je développe un module Prestashop Ma boutique : près de 90 000 produits. Un traitement : vérifier que tous les produits sont cohérents avec une source extérieure d'information. L'algo : Select tous les ID produit Pour chaque ID $p = new Product ($id_product); Traitement unset ($p) Sauf que au bout de ~80 000 produits, plus de mémoire. J'ai augmenté le paramètre php à 1024M, ce qui me parait plus que raisonnable et qui m'a permis de monter à cette valeur... Le unset ne libère pas tout et je n'ai pas trouvé de destructeur dans la classe Product. Euhh... qu'est-ce que voulais-je dire, déjà ??? Ah oui... quelqu'un aurait une idée pour me sortir de là ? Je ne suis pas un pro de php (plus de C++). A vous lire ! Link to comment Share on other sites More sharing options...
Whoami Posted October 1, 2013 Share Posted October 1, 2013 (edited) Bonjour, Je vois plusieurs idées pour résoudre ou contourner le problème. 1°) Il est possible d'implémenter le destructeur en php, dans l'override de la classe pour la propreté, ou dans ton module, dépends de ton code (a partir de php 5.3 de , il y a même le garbage collector). 2°) Le traitement peut éventuellement se faire en extérieur ? (via le webservice par exemple, avec un retour true ou nouvelle valeur si besoin d'update). 3°) Au pire, morceler le traitement (par lot de 30000 par exemple), sur 3 cron lancés à un certain intervalle. Cordialement, Edited October 1, 2013 by Whoami (see edit history) Link to comment Share on other sites More sharing options...
Raphaël Malié Posted October 1, 2013 Share Posted October 1, 2013 Salut, C'est normal car l'ObjectModel garde en mémoire les données du produit (c'est une optimisation assez foireuse car les objets sont trop souvent réinstanciés dans le code au lieu d'être passés en paramètre des fonctions). A moins que tu aies vraiment besoin d'instancier les classes, je te conseil plutôt d'uniquement travailler avec le tableau retournée par la requête SQL. Autrement tu peux faire $product->clearCache() pour vider le cache de ton produit. Link to comment Share on other sites More sharing options...
eprems Posted October 1, 2013 Author Share Posted October 1, 2013 Bonjour; @WhoAmI (il semble que vous ayez aussi une perte de mémoire ) Merci pour ces 3 idées... Je suis bien en 5.3, j'ai utilisé les fonctions de "gestion" de mémoire, mais je n'ai pas trouvé matière pour optimiser. WebService, je n'y avais pas pensé, je regarderai si éventuellement je coince. Morceler... on devient dépendant du nombre de produits qui peut grossir. La nuit portant conseille, j'ai abouti à 2 autres solutions : Sur l'idée de morceler, faire traiter par lot dans un script dédié et appelé par CURL. Une fois le process fini, la mémoire est libérée de faite. Autre idée, mais ne criez pas... Dans la phase mise à jour d'information (prix, stock, status) attaquer la base de données en directe. Je n'ai pas l'idée de "vendre" mon module, donc c'est entre moi et moi @Raphaël Je crée et modifie des produits. Dans le 2ième cas, la méthode save () est bien pratique... Je te teste la méthode de ObjectModel pour voir si je vais plus loin... @all Merci à vous 2 pour vos réponses rapides, elles me permettent d'avancer dans la finalisation de mon développement. Bruno Link to comment Share on other sites More sharing options...
Raphaël Malié Posted October 1, 2013 Share Posted October 1, 2013 Bah c'est sur que ça vient de là la fuite de mémoire, puisqu'à chaque fois que tu instancies un produit il y a un tableau interne en cache qui se remplie des données récupérées en base, tableau que tu ne peux vider qu'avec clearCache. C'est parce que ce tableau n'est même pas stocké directement dans le produit que le unset() n'a aucun effet. Link to comment Share on other sites More sharing options...
eprems Posted October 1, 2013 Author Share Posted October 1, 2013 @Raphaël Je ne m'émettais aucun doute sur ta proposition... Désolé que tu aies pu le comprendre ainsi. Donc, j'ai testé et c'est super... Mon scipt va jusqu'au bout ! Grand merci de m'avoir déniché cette méthode qui rend service, je m'en vais la généraliser dans mon code. Bruno Link to comment Share on other sites More sharing options...
Raphaël Malié Posted October 1, 2013 Share Posted October 1, 2013 Ah mais je ne l'ai pas mal pris, j'insistais juste pour que tu saches que c'était surtout ça la cause Cela dit je pense aussi que comme l'a dit Whoami, il faut morceler ce genre de scripts aussi, c'est plus simple pour les imports Cordialement, Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now