Accueil > Boîtes à outils > Tutoriels > Optimiser SPIP pour un hébergement (...)

Optimiser SPIP pour un hébergement mutualisé

SPIP est un système de gestion de contenu (CMS en anglais) très original grâce à ses squelettes. Sa syntaxe de boucles permet d’extraire toutes les informations saisies dans sa base de données par les rédacteurs du site, de la manière que l’on veut.

Hélas, cette souplesse à un cout : lors de la génération d’une page, le calcule des squelettes demande énormément de ressources au serveur d’hébergement.

Nous allons voir ici comment utiliser la fonction de cache de SPIP pour alléger la charge de vos sites. Cela vous économisera sans doute bien des réprimandes de votre hébergeur, et, plus important encore, accélèrera le temps de génération de vos pages. Vos visiteurs apprécieront.

Bien que rédigé pour la plateforme d’hébergement coopérative Ouvaton, cet article s’applique à tous les hébergements, et profitera aussi à votre site SPIP si vous l’hébergez sur votre serveur dédié.

0 - Le système de cache, comprendre la base

Lorsqu’un visiteur demande à voir une page de votre site, SPIP regarde à quel squelette elle correspond, la génère (ce qui nécessite de nombreux calculs) et l’envoie au visiteur. Ensuite, il écrit la page calculée dans son cache.

Si un autre visiteur demande la même page 5 minutes après, il lui délivrera immédiatement la page en cache, gagnant ainsi beaucoup de temps.

Le temps durant lequel une version en cache va être considérée comme valide est défini par la variable $delais, mesurée en seconde.

Passé ce délais, la version en cache est considérée comme périmée, et la page entière doit être recalculée.

Pour une explication détaillée de ce processus, lire la documentation de SPIP : Principe général.

1 - Bien régler le délais

La première règle de base concernant l’optimisation des performances de votre site SPIP est de bien choisir un délais approprié pour chaque squelette différent.

Si votre site ne change pas trop souvent, un délais d’une journée pour chaque page en cache est tout à fait honorable : $delais=86400 ;

Abaissez seulement le délais si votre site bouge souvent, ou si telle ou telle page évolue rapidement. Un délais d’une heure semble convenir à tous les sites très actifs : $delais = 3600 ;

Au pire, si votre page d’accueil évolue en temps réel, un cache de 5 minutes semble un minimum à respecter : $delais = 300 ;

2 - Répartissez les boucles sur différents squelettes

C’est là la principale astuce pour diminuer de façon drastique la charge que votre site imposera aux serveurs qui l’hébergent.

La fonction SPIP à utiliser est la fonction d’inclusion, dont vous pourrez lire tous les détails ici : INCLURE d’autres squelettes.

Le principe est le suivant : délocalisez les boucles consommatrices sur des sous-squelettes.

Imaginons votre site ayant 100 articles. Sur votre squelette articles.html, existe une boucle qui affiche, dans la colonne de droite, les 5 articles les plus récent de votre site.

Si ces 100 articles sont appelés par des visiteurs (ou un moteur de recherche indexant méthodiquement votre site), alors cette boucle va être exécutée 100 fois.

Maintenant, si vous créez un petit squelette ne comportant que cette boucle, et que vous la remplacez par la fonction INCLURE dans le squelette original, alors la boucle ne sera calculée qu’une seule fois, puis son cache sera inclus les 99 autres fois où les autres pages articles seront générées.

Le gain en terme de ressources, et donc de temps de calcul, sera très important.

Le deuxième effet kiss cool : de plus, maintenant que vous avez isolé sur un squelette extérieur, la partie mobile de vos squelettes articles, vous pouvez très certainement augmenter considérablement le délais des squelettes articles. Pourquoi pas une semaine ($delais = 604800 ;) ou un mois ($delais = 2592000 ;), si rien d’autre n’a de raison de changer dans vos pages article.

3 - Passer des paramètres aux squelettes inclus

N’oubliez pas que vous pouvez passez des paramètres aux squelettes inclus.

Ainsi, si, au lieu de lister les 5 derniers articles de votre site, vous voulez lister les 5 derniers articles de la rubrique en cours, sur chaque page article. Dans ce cas, il suffit d’ajouter le critère {id_rubrique} dans la boucle à inclure, et d’écrire, dans votre squelette d’article :

<INCLURE{fond=les_5_derniers_articles}{id_rubrique}>

Imaginez que vos 100 articles soient répartis dans 5 rubriques, alors une version pour chaque rubrique de la boucle à inclure sera mise en cache, ce qui fait tout de même une économie de 19 générations de boucles pour 20 affichages.

4 - Différentiez les délais

Si vous utilisez donc cette technique d’extraction des boucles sur des mini-squelettes, essayez d’attribuer des délais différents à vos squelettes. Le but est ainsi d’obtenir un décalage de la génération des sous-squelettes, et qu’ils n’arrivent ainsi pas tous en même temps à expiration.

En faisant en sorte que ces sous-squelettes ne se régénèrent pas en même temps, vous évitez qu’une seule page (celle pour laquelle il faudra recalculer tous les squelettes car les versions en cache seront considérées comme périmées) ne mettre un temps démesuré à se générer.

Conclusion : des gains phénoménaux facilement obtenus

En bref, externaliser les boucles pour en diminuer drastiquement le nombre de générations, est un moyen formidable, et vraiment peu couteux, d’alléger la charge de votre site, et ainsi diminuer le temps de génération de vos pages.

Bien sur, il restera toujours quelques boucles qui ne se prêteront pas à ce genre d’optimisation (comme "afficher un lien vers l’article suivant ou précédant", ce genre de boucle n’a aucun intérêt à être sortie du squelette principal) mais pour la quasi totalité des sites, cette méthode est entièrement applicable. Pensez à tous les sites qui affichent systématiquement la liste de leurs rubriques sur toutes leurs pages : il suffit d’extraire cette boucle sur un squelette mes_rubriques.html et d’inclure ce squelette sur tous les autres squelettes du site (article, rubrique, page d’accueil, ...).