Warm-up cache pour Prestashop

Warm-up cache pour Prestashop

L'idée ici, c'est d'avoir toujours les caches Smarty de créés. Lorsque qu'un utlisateur visite la boutique, il ne tombe pas sur pas sur des page dont il faut créer le cache.

Créer le cache peut être assez long sur certain server. Donc an va faire très simple, on va faire une tâche cron en 3 lignes, qui va tout les jours appeler tous les produits de la boutique et ainsi, créer les caches.

Une tache cron

On pourrait faire le script en PHP, mais le faire en BASH sera plus rapide. Et se retrouver avec des script PHP dans le crontab, c'est pas hyper estétique. Ca fait bizarre.

En BASH, on ne peut pas appeler les méthodes de la classe Link pour pour avoir les URL, forcement.

La bonne nouvelle, c'est que les URL dont on a besoin sont probablement dans le SiteMap. Ici, j'utilise un sitemap du module de Linèa Graphica. Mais le fonctionnement est strictement identique avec le module gSiteMap.

Je précise que sur le module Linéa Graphica, j'ai enlevé les images du paramétrage. 

Facile en 5 étapes:

  1. On charge le sitemap avec wget
  2. On cherche les URL avec une regex (egrep -o)
  3. On fait une boucle
  4. Avec Wget, on appelle les URL
  5. Juste un peu d'optimisation
#!/bin/bash
wget --quiet https://masuperboutique.fr/modules/lgsitemaps/product_1_1.xml --no-cache --output-document - | egrep -o "http(s?)://$URL[^] "()<>]*" | while read LINE; do
	wget --spider --quiet --no-cache $LINE> /dev/null 2>&1
done>

Si vous n'avez jamais fait de BASH avant, bien vous pouvez vous rendre contre que c'est assez litéral, et facilement compréhensible.

Sauf pour "/dev/null 2>&1" qui concerne le message de sortie, mais c'est pas hyper important.

Le pipe | permet de chainer les commandes, ce qui permet de traiter les lignes lues dans le fichiers sitemap au fil de l'eau.

Je précise que l'option "--spider" de wget est assez géniale, puisqu'elle ne récupère que le code de la réponse HTML (ici 200) sans charger, ni les fichier, ni la page. Du coup, le server ne fait que calculer la page, et donc génére le cache, si celui-ci n'existe pas.

Bref, que du bonheur.

Si vous souhaitez faire un script avec un peu plus de contrôle, par exemple, lorsque vous le lancez manuellement, vous pouvez ajouter des éléments de debug. De toutes façons, une fois lançé avec une tâche cron, de mettre du debug ou non n'aura plus vraiment d'importance.

Vous pouvez également relancer Memcached et PHP, ça relancera les process à vide, sans leak de mémoire. 

Ici, j'ai ajouté un sleep 10. Si vous ne mettez pas de pause entre chaque boucle, la disponibilité de votre server sera moindre durant la durée d'exécution de script. Ceci peut être embếtant si Google scrapte votre boutique au même moment.

#!/bin/bash

service memcached restart
service php7.0-fpm restart

wget --quiet https://masuperboutique.fr/modules/lgsitemaps/product_1_1.xml --no-cache --output-document - | egrep -o "http(s?)://$URL[^] "()<>]*" | while read LINE; do
	wget --spider --quiet $LINE --no-cache > /dev/null 2>&1
	echo $LINE
	LOOP=$((LOOP + 1))
	echo $LOOP;
	sleep 10
done

L'optimisation

Pour prestaShop, la générations des pages produits est généralement assez rapide. Il n'y a pas trop d'attente. Mais sur les catégories, c'est plus problématique.

Pour la suite, c'est à vous de voir, mais j'ai constater, qu'en fait, ce script avait plus d'effet sur les pages catégorie. Donc du coup, je conseille aussi de scraper les URLs des pages categorie (le module de Linéa Graphica propose un sitemap catégorie).

Donc l'idée, c'est de le faire sur les produits, et sur les categories. Mais si vous avez des milliers de produits et de centaines de catégories, vous ne pourrez peut-être pas exécuter les 2 scripts produit et catégorie en 1 jours. A vous de voir.

Bon scrape.