Beoneself Posted January 9, 2012 Share Posted January 9, 2012 Bonjour, Ce sujet fait suite à un incident que nous avons eu ce week end sur une plateforme prestashop 1.4.3. Nous avons actuellement un cache Kyoto Tycoon - moteur plus performant que Memcached qui tourne sur les mêmes classes PHP que Memcached, donc parfaitement compatible avec Prestashop. Nous avons eu des dépassements de mémoire occasionnés par la classe MCached lignes 85 et 86: $this->_keysCached = $this->_memcacheObj->get('keysCached'); $this->_tablesCached = $this->_memcacheObj->get('tablesCached'); Ces quelques lignes de codes se chargent à chaque exécution de page de charger dans la mémoire d'exécution PHP les clés et les tables mises en caches. Si je vois un intérêt à cette manière de fonctionner, le fait de simplifier l'implémentation du cache dans les classes du coeur de prestashop, cela peut causer des soucis. Tout d'abord nous avons actuellement un site fonctionnant en 5 langues. Donc pour un chargement en français, on aura également dans la mémoire PHP l'intégralité des informations des 4 autres langues. Si cela ne posera pas de soucis sur un petit site, même avec du trafic, cela nous pose soucis sur nos 800 catégories et 13000 références. L'erreur déclenchée étant une fatale error, nos clients se sont retrouvés avec une page blanche. Suggestions: - Nous allons reprendre l'implémentation du cache prestashop afin de l'implémenter à un plus bas niveau. - Nous allons ajouter une couche de gestion des erreurs afin de pouvoir rediriger les clients automatiquement vers une page de maintenance en html "dur". Je pense que ces points pourraient être repris dans le code du futur 1.5, c'est pourquoi je souhaites ouvrir la discussion. Je viens par ailleurs de télécharger la beta 1.5.0.3 de prestashop et même si le fonctionnement est un peu différent, c'est fois-ci c'est dans le __construct de la classe CacheMemcache que nous avons un chargement intégral des clés, bien que ce tableau ne soit pas exploité dans le getter magique. public function __construct() { $this->connect(); // Get keys (this code come from Doctrine 2 project) $this->keys = array(); foreach ($this->memcache->getExtendedStats('slabs') as $server => $slabs) if (is_array($slabs)) foreach (array_keys($slabs) as $slab_id) if ($this->memcache->getExtendedStats('cachedump', (int)$slab_id)) foreach ($dump as $entries) foreach ($entries as $entry) $this->keys[$entry] = 0;; } Et: /** * @see Cache::_get() */ protected function _get($key) { if (!$this->is_connected) return false; return $this->memcache->get($key); } D'ailleurs le @see Cache::_get() est peut-être de trop, étant donné que Cache::__get() est une méthode abstraite et qu'il n'y a pas d'appel au parent. Qu'en pensez-vous ? Avez-vous déjà travaillé sur l'implémentation du cache de prestashop ? Xavier. Link to comment Share on other sites More sharing options...
Beoneself Posted January 9, 2012 Author Share Posted January 9, 2012 Par ailleurs on a une forte croissance au niveau du nombre de clés dans le cache en quelques heures. Quelqu'un as-t-il déjà eu ce cas ? Comment l'avez-vous résolu ? Merci. 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