eCommerce

Améliorer la gestion du cache Prestashop

Prestashop E-Commerce

Gestion du cache Prestashop

Ta boutique Prestashop est lente ? Tu as déjà tout optimisé et pourtant rien n’y fait ? Peut-être que tu veux encore grappiller des milisecondes… (oui il y a un réel intérêt) ! Voici une méthode réservée aux experts.

Les points essentiels

La solution que je donne ici est vraiment à utiliser si avec les optimisations standard, la boutique ne donne pas satisfaction. J’entends par là, après avoir choisi un hébergeur rapide, en ayant activé le cache et « ne pas forcer la recompilation », en utilisant la compression des JS / CSS… et aussi en utilisant les compressions proposées  par votre hébergeur en ajoutant des règles dans votre .htaccess (enfin ça je vous laisse regarder sur le net). Notez aussi que le poids des images de votre thème peuvent aussi influencer le temps de chargement de votre boutique… donc ça fait déjà pas mal de choses à vérifier.

Ouai mais qu’est-ce qui fait ralentir ?

A un certain stade, comme par exemple pour Autodingo, les pages sont en cache, mais les requêtes continuent à s’exécuter… certaines ne sont pas forcément utile, par exemple dans mon cas j’ai les billets du blog… inutile d’aller chercher chaque fois les infos… ça fait perdre du temps… la page s’affiche moins vite du coup… Si on cumule cette logique à plein de blocs, modules… la boutique ralentira de plus en plus en fonction du nombre de blocs affichés et du trafic.

Que faut-il faire alors ?

Bon ben là… y’a que les développeurs qui comprendront… on va en fait stocker les résultats dans un fichier pour éviter de devoir interroger la base de données pour rien. Il est plus rapide d’accéder à un fichier de cache pour récupérer le résultat qu’à chaque fois interroger la base de données… puis au bout de X temps… genre 1h ben on va donner la directive que la requête doit se lancer à nouveau et re-générer le cache.

Mettre en oeuvre CacheLite

C’est une petite classe PHP que j’ai développé pour mettre en cache les résultats des requêtes pour une durée de genre 1h. L’utilisation est assez simple, on va par exemple essayer de la mettre en oeuvre sur le bloc des meilleures ventes… on n’est pas obligé de savoir les meilleures ventes à la minutes près.

Première chose, mettre le fichier CacheLite.php sous « override/classes », le fichier doit contenir le code suivant :

[php]<?php
class CacheLite{

// validité du cache 1h
public static $expire = 3600;

/*
* Vérifie si le contenu est en cache
* @param string (nom de l’information en cache)
* return bool
*/
static function exists($info_name){
self::deleteAllCache();
$cache = _PS_SMARTY_DIR_.’cache/’.$info_name.’.cachelite’;
$expire = time()-self::$expire ;
if(file_exists($cache) && filemtime($cache) > $expire){
return true;
}else{
return false;
}
}

/*
* Récupére les informations en cach
* @param string (nom de l’information en cache)
* return data
*/
static function get($info_name){
$cache = _PS_SMARTY_DIR_.’cache/’.$info_name.’.cachelite’;
$expire = time()-self::$expire ;
if(file_exists($cache) && filemtime($cache) > $expire){
return unserialize(file_get_contents($cache));
}else{
return;
}
}

/*
* Récupére les informations en cache
* @param string (nom de l’information à mettre en cache)
* @param string (valeur)
* return –
*/
static function write($info_name,$content){
$cache = _PS_SMARTY_DIR_.’cache/’.$info_name.’.cachelite’;
if(Configuration::get(‘PS_SMARTY_CACHE’)==1){
file_put_contents($cache,serialize($content));
}
}

/*
* Supprime tous les éléments du Cachelite
* @param –
* return –
*/
static function deleteAllCache(){
if(Configuration::get(‘PS_SMARTY_CACHE’)==0){
$dir = _PS_SMARTY_DIR_.’cache’;
$dirHandle = opendir($dir);
while ($file = readdir($dirHandle)){
if(!is_dir($file)) {
if(strpos($file,’.cachelite’)!==false){
unlink($dir.’/’.$file);
}
}
}
closedir($dirHandle);
}
}

}
?>[/php]
Ensuite il faut modifier la ligne suivante du fichier « modules/blockbestsellers.php » :

[php]
$bestsellers = ProductSale::getBestSalesLight((int)($params[‘cookie’]->id_lang), 0, 5);
[/php]
Par

[php]
// si le cache existe
if(CacheLite::exists(‘bestseller’)){
$bestsellers = CacheLite::get(‘bestseller’);
// création du cache
}else{
$bestsellers = ProductSale::getBestSalesLight((int)($params[‘cookie’]->id_lang), 0, 5);
CacheLite::write(‘bestseller’,$bestsellers);
}
[/php]
Ensuite il faut bien vérifier dans le back-office que le cache soit activé (pour que le fichier de cache se génère).

prestashop-cache-2-300x115

Dans le répertoire /tools/smarty/cache, vous pouvez voir le fichier généré.

prestashop_cache_fichier-300x127

Voilà, à présent lors de chaque affichage les résultats seront puisés directement dans le cache au lieu de solliciter la base de données.

Pfaaa c’est nul !
En fait il faut bien comprendre ceci, bien sûr si vous avez 2 visiteurs en ligne… finalement on s’en fou… Mais quand vous en avez 100 ou 150… les requêtes inutiles peuvent vite devenir pesantes et ralentir fortement la navigation. La mise en cache des requêtes dans Prestashop, n’est pas vraiment son point fort, il y’a beaucoup d’éléments qui pourraient être mis en cache de manière à augmenter la vitesse d’affichage du site.

Bilan
Il faut savoir qu’une boutique lente, donne envie au client de déserter… il faut vraiment que l’affichage soit rapide… actuellement on voit rarement un site « trop » rapide, par contre les sites lents… se comptent à la pelle. Bien sûr il faut bien effectuer cette approche de manière progressive « en cas de lenteur », c’est-à-dire de commencer par les éléments essentiels… rien de sert d’appliquer cette méthode si votre hébergeur est en mode « discount »… Enfin voilà une technique possible, j’espère qu’elle fonctionnera pour vous !

Source: Webbax.ch