Et si votre WordPress fonctionnait de concert avec Varnish ?

Et si votre WordPress fonctionnait de concert avec Varnish ?

Il y a quelques temps déjà, un prospect nous contacte car son site est mal en point et ne répond pas assez vite, pire que ça, il est souvent indisponible. Nous avons alors mis en place un cache Varnish et avons développé un petit plugin pour gérer le cache Varnish, mais pourquoi avoir redéveloppé un plugin ?

Et tout commence par un cache efficace : Varnish

Varnish à la base est un système de cache développé pour un journal en ligne nommé Verdens Gang. Dans notre cas, ce client a également un site d’informations et d’actualités sur le Padel alors il était tout logique de mettre en place le digne Varnish Cache (avec Varnish, les problèmes s’évanouishent … très de plaisanteries …).

Varnish a un gros intérêt, celui de mettre en pratique le principe du Stale While Revalidate. En gros, quand un contenu est demandé, si celui-ci est présent il le sert, si celui-ci commence à expirer, Varnish va en récupérer une copie fraiche et pendant le laps de temps là, va continuer à servir le contenu périmé. Une fois le nouveau contenu récupéré, il servira le contenu actualisé.

Le comportement de Varnish se personnalise grâce à un VCL et il est possible de ne mettre en cache que certaines parties. De notre côté, nous avons pris le partie de mettre un load balancer en frontal, qui est HaProxy.

Haproxy a un rôle d’aiguilleur et va se charger de :

– refuser la requête en fonction de certains critères
– traiter la requête et la diriger vers le cache si la requête correspond aux critères nécessaires pour ce faire (exemple, les robots d’indexation sont envoyés en priorité vers Varnish par exemple)
– diriger la requête vers le backend sans passer par Varnish si celle-ci est une requête dite dynamique

Cette façon de faire nous permet de ne pas tout mélanger.

Par défaut, tout ce qui passe par Varnish est systématiquement mis en cache et gardé en cache et c’est là qu’intervient notre plugin.

Et votre plugin, que fait-il ?

Notre plugin a 2 rôles principaux : effacer le cache intelligemment, précharger le contenu en backoffice pour que les visiteurs aient la page instantanément. Voici du code plutôt qu’un long discours

/**
* Plugin Name: Weobia Varnish Cache Manager
* Plugin URI: https://www.weobia.fr/
* Description: Gere l'effacement du cache Varnish
* Version: 2024.01
* Author: Weobia
* Author URI: https://www.weobia.fr/
**/

if ( ! function_exists('write_log')) {
   function write_log ( $log )  {
      if ( is_array( $log ) || is_object( $log ) ) {
         error_log( print_r( $log, true ) );
      } else {
         error_log( $log );
      }
   }
}

function updated_post_hook_action($post_id, $post,$update){


  if (wp_is_post_autosave($post_id) || wp_is_post_revision( $post_id )) {
          return;
  }

  if ( ! $update ) {
       return;
  }

    $permalink = get_permalink($post_id);
    write_log("Post with permalink {$permalink} updated"); 
    $url = $permalink;

    if ( substr( $url, 0, 1 ) === "?"){
       return;
    }

    // Create a Curl Handle.
    $ch = curl_init();
    // Standard PHP/Curl options for a simple GET request.
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PURGE");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'WordPress Cache Purge Notifier');
    // Execute the request.
    $response = curl_exec($ch);
    write_log("Cache purge for {$permalink} done"); 

    $ch = curl_init();
    // Standard PHP/Curl options for a simple GET request.
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'WordPress Cache Preloader Notifier');
    // Execute the request.
    $response = curl_exec($ch);
    write_log("Cache for {$permalink} preloaded"); 

    $ch = curl_init();
    // Standard PHP/Curl options for a simple GET request.
    curl_setopt($ch, CURLOPT_URL, $url."?amp");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'WordPress Cache Preloader Notifier');
    // Execute the request.
    $response = curl_exec($ch);
    write_log("Cache for {$permalink} AMP preloaded"); 

}

add_action('save_post_post', 'updated_post_hook_action', 10, 3);

Donc pour expliquer son fonctionnement. Dès qu’un article est ajouté dans le backoffice de WordPress, la méthode updated_post_hook_action se déclenche. On récupère le lien permanent de la page en question et c’est là que la magie va opérer :

– on purge la page en cours d’édition si celle-ci existe
– on précharge la page
– on précharge la page AMP (ce site contient de l’AMP)

On pourrait ajouter un effacement de la page d’accueil et un préchargement de celle-ci mais nous ne l’avons pas fait car le temps de cache est relativement court sur cette page.

Voilà une petite méthode, relativement KISS (Keep It So Simple ou faisons simple) pour avoir un site sous WordPress qui fonctionne sans trop se poser la question de savoir si celui-ci va tenir la charge ou non. Varnish s’occupera du reste !

Headless CMS: notre blog en est un exemple
RGPD : mettez votre site internet en conformité
Elementor mon cher Watson !
Maintenez vos CMS à jour