Vider le cache nginx fastcgi via PHP (et/ou WordPress)

J’ai consacré 15 minutes ce matin sur un site de test pour savoir comment je commencerais à vider le cache du fastcgi via PHP.

…heures plus tard, et j’ai utilisé ce moment pour mettre au point un plugin WordPress. Mais commençons par un petit script PHP qui va effectivement purger tout le cache nginx….

<?php
  array_map('unlink', glob("/path/to/nginx/cache/*/*/*"));
  array_map('rmdir', glob("/path/to/nginx/cache/*/*"));
  array_map('rmdir', glob("/path/to/nginx/cache/*"));
 ?>

Simple, n’est-ce pas ? Et techniquement, vous n’avez besoin que de la première ligne puisque la première supprime les fichiers de cache, tandis que les deuxième et troisième suppriment les répertoires maintenant vides (que nginx recréera de toute façon).

Mais tant que ce qui suit est vrai, ça marche :

  • Vous utilisez levels=1:2 pour le cache dans votre configuration nginx (une partie du bit fastcgi_cache_path).
  • Vous avez remplacé la partie /path/to/nginx/cache/ par l’emplacement réel de votre cache (partie du bit fastcgi_cache_path dans votre configuration nginx)
  • PHP a les permissions requises pour écrire à cet endroit (si vous exécutez nginx et php en tant que même utilisateur, il devrait fonctionner « out of the box » – sinon vous devrez ajuster les permissions pour que nginx et php puissent tous deux y écrire).
  • Vous n’avez pas d’autre problème.

Bien sûr, il efface la totalité du cache, mais c’est génial dans la mesure où vous pouvez accéder à ce fichier php à tout moment pour le purger.

C’est la base du plugin WordPress que j’ai commencé à mettre au point et dont je parlerai plus tard.

D’un autre côté, si vous vouliez simplement supprimer 1 fichier en cache, les choses commencent à devenir un peu plus délicates… « Jesin A » a réalisé un guide fantastique sur l’Océan numérique, et je vais le mentionner ici aussi :

<?php
$cache_path = '/etc/nginx/cache/';
$url = parse_url($_POST['url']);
if(!$url)
{
    echo 'Invalid URL entered';
    die();
}
$scheme = $url['scheme'];
$host = $url['host'];
$requesturi = $url['path'];
$hash = md5($scheme.'GET'.$host.$requesturi);
var_dump(unlink($cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash));
?>

Dans ce script, vous devez envoyer un POSTE à ce script avec l’URL que vous voulez effacer. L’exemple donné est le suivant (dans ce cas, vous viderez le cache de http://www.example.com/time.php) :

curl -d 'url=http://www.example.com/time.php' http://localhost/purge.php

…un grand merci à « Jesin A » aussi – j’ai fini par l’utiliser dans le plugin pour donner une option permettant de vider manuellement les pages, et le texte sur le site DigitalOcean vaut vraiment la peine d’être lu si vous êtes novice dans ce domaine.

Etendre le tout à un plugin WordPress !

Ok, alors voilà le truc… si vous voulez utiliser le plugin, vous pouvez, mais il y a un petit avertissement ! L’emplacement du répertoire de cache nginx est codé en dur dans le plugin, donc vous devrez l’éditer et le changer en <quel que soit le répertoire correct sur votre serveur> AVANT de l’activer.

Je n’insisterai jamais assez sur ce point : dès qu’il sera activé, il essaiera de se purger automatiquement lorsque vous modifierez des messages, etc., et s’il commence à essayer de supprimer des fichiers au mauvais endroit sur votre serveur (….), vous serez seul. Je vous suggère de sauvegarder tout ce qui est important, juste au cas où.

Téléchargement : nginx-fastcgi-cache-purge.zip (v0.0.2)
(N’oubliez pas de le modifier avant de l’activer, et qu’il ne supporte que « levels=1:2 » dans votre configuration de cache nginx fastcgi. Actuellement, il suppose que « /etc/nginx/cache/ » est votre dossier de cache, alors assurez-vous de le modifier s’il n’est pas correct).

Ok, donc maintenant que vous êtes (espérons) en train de le modifier pendant que votre serveur est en train de sauvegarder, voici quelques points forts :

  • Auto purge tout le cache chaque fois que vous modifiez un message, changez de thème, ajoutez/supprimez une catégorie, et je pense que cela devrait fonctionner également lorsque vous approuvez un commentaire.
  • Il y a une page d’option où vous pouvez purger tout le cache ou des pages individuelles.
  • Il y a quelques contrôles intégrés pour vous avertir si le dossier du cache n’est pas là et accessible en écriture.
  • Vous indique quels messages/pages WordPress sont actuellement mis en cache.
  • Vous indique le nombre total de pages mises en cache.
  • Ne crée pas de nouvelles entrées dans la base de données WordPress. Donc si vous le détestez et le supprimez, vous n’aurez pas de déchets supplémentaires dans votre base de données MySQL.

Quelques inconvénients :

  • Quand je dis qu’il purge tout, il purge tout. Si vous avez quelques sites sur le serveur qui partagent (vraisemblablement) le même cache, ils seront tous effacés (à la fois automatiquement et lorsque vous les purgez tous manuellement). Vous pouvez les désactiver avec quelques modifications si vous le souhaitez.
  • Il n’y a aucun moyen de détecter automatiquement l’emplacement de votre cache, il est donc simplement codé en dur dans le fichier et vous devez le modifier pour le changer.
  • En principe, il se connecterait à d’autres programmes de mise en cache courants (si possible) afin de s’effacer lorsque vous « videz le cache » manuellement dans un autre plugin, mais ce n’est pas le cas. Donc si vous vous battez avec un contenu qui n’a pas changé dans disons le W3TC, vous devrez « Vider tous les caches » là et ensuite aller dans la page d’option de ce plugin et faire de même.
  • La purge manuelle (quand la purge automatique ne fait pas l’affaire) doit être faite à partir de la page d’options – pas de bouton « Vider tous les caches ».
  • …probablement quelques autres choses.

Quelques captures d’écran de la page d’options (cliquez pour agrandir) :

nginx-cache-purge-1 nginx-cache-purge-2 nginx-cache-purge-3

Juste au cas où vous l’auriez manqué, téléchargez à nouveau le lien (veuillez lire les avertissements ci-dessus et effectuer les modifications avant d’activer).

Téléchargement : nginx-fastcgi-cache-purge.zip (v0.0.2)
(Vous pouvez le télécharger sur votre installation WordPress (via la page des plugins), mais rappelez-vous qu’il suppose que « levels=1:2 » et « /etc/nginx/cache/ » sont la façon dont vous avez configuré les choses puisque la plupart des guides/tutoriels nginx utilisent ces derniers, mais vous devez les modifier aux valeurs correctes avant de les activer) !

N’hésitez pas à laisser un commentaire si cela a marché pour vous (ou pas !).

7 Commentaires | Tapez un commentaire.

 Trier par ancienneté | Trier par nouveauté
  1. Le plugin wordpress ne fonctionne pas avec mon Nginx. Ai-je besoin d'abord du module de purge du cache nginx ? J'essaie de vider tout le cache, le répertoire et les fichiers existaient toujours. Voici la capture d'écran http://i.imgur.com/1GTOwTj.jpg

    Mon utilisateur nginx est le même avec mon utilisateur wordpress sous Linux. Ne faites toujours rien et ne pas purger ces cache.
    • Salut Beny. Le plugin n'a pas besoin ou n'utilise pas le module de purge du cache. J'ai regardé votre capture d'écran - essayez d'ajouter une barre oblique de fin au chemin afin que ce soit /var/cache/nginx/mfit/ au lieu de simplement /var/cache/nginx/mfit. Lorsque le chemin est correct, il devrait en fait lister certains des messages mis en cache et dire que « _ ont été appariés à vos postes/pages et sont listés ci-dessous ». Comme il ne correspond à rien, c'est une indication que le chemin n'est pas correct.

      Faites-moi savoir si vous rencontrez des problèmes. Bonne chance !
  2. Nel sur août 11, 2015 - cliquez ici pour répondre
    Salut, j'utilise la mise en cache proxy et cela fonctionne pour moi, mais le seul problème est que Nginx génère toujours un fichier mis en cache non inscriptible et cela provoque le plugin ne peut pas détecter les fichiers mis en cache, donc, j'ai besoin de chmod tous les fichiers mis en cache à 777 et faire le plugin détecté.

    Comment générer des fichiers mis en cache en écriture par Nginx ?
    • Hé Nel,

      Il y a des chances que nginx et PHP fonctionnent comme des utilisateurs différents. Quelques options en haut de ma tête :

      -Exécutez PHP et nginx en tant que même utilisateur (fait dans les fichiers de configuration pour les deux). Vous devez être sûr de chmod les répertoires appropriés par la suite pour vous assurer qu'ils peuvent lire les « vieux trucs » qu'ils ont créés sous les comptes utilisateur précédents (ou sous « personne »).

      -Modifiez les autorisations utilisateur/groupe afin que le compte utilisateur PHP actuel puisse écrire dans les fichiers cache.

      -Écrivez un script shell/bash (ou un simple crontab qui s'exécute toutes les minutes ou quelque chose) qui vérifie en permanence le dossier cache et modifie automatiquement les autorisations. C'est probablement l'option la moins sujette aux erreurs, mais aussi la plus maladroite.
      • Nel sur août 12, 2015 - cliquez ici pour répondre
        Doux ! J'ai modifié les autorisations utilisateur Nginx même que l'utilisateur PHP alors cela a fonctionné.

        Btw, le cache fastcgi a-t-il le même problème non inscriptible ?
  3. Fantastique article, j'étais exactement à la recherche de cela. Je vais l'appliquer à un projet Laravel. Merci beaucoup.
  4. Trung Phan sur novembre 20, 2023 - cliquez ici pour répondre
    Merci beaucoup. Ce plugin est très utile.

Tapez un commentaire.

Vous pouvez utiliser un pseudonyme et un faux courriel. Toutefois, si vous choisissez d'utiliser un vrai courrier électronique, les "gravatars" sont pris en charge. Lisez la politique de confidentialité pour plus de détails.