Leeren des nginx fastcgi-Cache über PHP (und/oder WordPress)

Ich habe mir heute Morgen auf einer Testseite 15 Minuten Zeit genommen, um entweder herauszufinden, wie ich anfangen würde, den Fastcgi-Cache über PHP zu leeren.

…Stunden später, und ich habe dieses Bit benutzt, um ein WordPress-Plugin zusammenzustellen. Aber lassen Sie uns mit einem kleinen PHP-Skript beginnen, das den gesamten nginx-Cache…. effektiv leert.

<?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/*"));
 ?>

Einfach, oder? Und technisch gesehen bräuchten Sie nur die erste Zeile, da #1 die eigentlichen Cache-Dateien entfernt, während #2 und #3 nur die jetzt leeren Verzeichnisse entfernen (die nginx irgendwann sowieso wiederherstellen wird).

Aber solange die folgenden Punkte wahr sind, funktioniert es:

  • Sie benutzen levels=1:2 für den Cache in Ihrer nginx-Konfiguration (Teil des fastcgi_cache_path Bits).
  • Sie haben den Teil /path/to/nginx/cache/ durch den tatsächlichen Speicherort Ihres Caches ersetzt (Teil des fastcgi_cache_path Bits in Ihrer nginx-Konfiguration).
  • PHP hat die erforderlichen Berechtigungen, um an diesen Ort zu schreiben (wenn Sie nginx und php als derselbe Benutzer ausführen, sollte es „out of the box“ funktionieren – andernfalls müssen Sie die Berechtigungen so anpassen, dass sowohl nginx als auch php dort schreiben können).
  • Sie haben nicht noch etwas anderes Schräges am Laufen.

Natürlich löscht es den gesamten Cache, aber es ist insofern großartig, als dass Sie jederzeit einfach auf diese php-Datei zugreifen können, wenn Sie sie bereinigen müssen.

Dies war die Grundlage für das WordPress-Plugin, das ich angefangen habe, zusammenzustellen, auf das ich später eingehen werde.

Wenn Sie auf der anderen Seite nur 1 gecachte Datei entfernen wollten, werden die Dinge ein wenig schwieriger… „Jesin A“ hat einen fantastischen Führer über Digital Ocean zusammengestellt, und ich werde diesen hier auch erwähnen:

<?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));
?>

In diesem Skript müssten Sie einen POST an dieses Skript mit der URL senden, die Sie löschen möchten. Das folgende Beispiel wurde angegeben (in diesem Fall würden Sie http://www.example.com/time.php aus dem Cache löschen):

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

…ein großes Dankeschön auch an „Jesin A“ – ich habe ihn schließlich im Plugin verwendet, um eine Option zum manuellen Löschen von Seiten zu bieten, und der Artikel auf der DigitalOcean-Website ist definitiv eine Lektüre wert, wenn Sie mit diesem Zeug überhaupt nichts anfangen können.

Alles zu einem WordPress-Plugin erweitern!

Ok, also hier ist der Deal… wenn Sie das Plugin benutzen wollen, können Sie das, aber es kommt mit einer kleinen Warnung! Der Speicherort des nginx-Cache-Verzeichnisses ist im Plugin fest einprogrammiert, also werden Sie es bearbeiten und in <was auch immer das richtige auf Ihrem Server ist> BEVOR Sie es aktivieren.

Ich kann das nicht genug betonen – sobald es aktiviert ist, wird es versuchen, automatisch zu bereinigen, wenn Sie Beiträge bearbeiten, usw., und wenn es versucht, Dateien an der falschen Stelle auf Ihrem Server zu löschen…., sind Sie auf sich allein gestellt. Ich schlage vor, dass Sie für alle Fälle eine Sicherheitskopie von allem machen, was wichtig ist.

Herunterladen: nginx-fastcgi-cache-purge.zip (v0.0.2)
(Denken Sie daran, sie vor der Aktivierung zu BEARBEITEN, und dass sie nur „levels=1:2“ in Ihrer nginx-fastcgi-cache-Einrichtung unterstützt. Momentan nimmt es „/etc/nginx/cache/“ als Ihren Cache-Ordner an, also stellen Sie sicher, dass Sie das bearbeiten, wenn es nicht korrekt ist).

Ok, jetzt, wo Sie es (hoffentlich) bearbeiten, während Ihr Server ein Backup durchführt, hier sind einige der Highlights:

  • Auto leert den gesamten Cache jedes Mal, wenn Sie einen Beitrag bearbeiten, ein Thema wechseln, eine Kategorie hinzufügen/löschen, und ich glaube, es sollte auch funktionieren, wenn Sie einen Kommentar genehmigen.
  • Hat eine Optionsseite, auf der Sie den gesamten Cache oder einzelne Seiten löschen können.
  • Hat ein paar eingebaute Überprüfungen, um Sie zu benachrichtigen, wenn der Cache-Ordner seiner Meinung nach nicht vorhanden und beschreibbar ist.
  • Zeigt Ihnen, welche WordPress-Beiträge/Seiten derzeit im Cache gespeichert sind.
  • Informiert Sie über die Gesamtzahl der zwischengespeicherten Seiten.
  • Erzeugt keine neuen Einträge in der WordPress-Datenbank. Wenn Sie es also hassen und entfernen, werden Sie keinen zusätzlichen Müll in Ihrer MySQL-Datenbank haben.

Das hat ein paar Nachteile:

  • Wenn ich sage, es bereinigt alles, bereinigt es alles. Wenn Sie einige wenige Sites auf dem Server haben, die sich (vermutlich) alle denselben Cache teilen, werden sie alle gelöscht (sowohl automatisch als auch beim manuellen Bereinigen). Sie könnten diese mit einigen Bearbeitungen deaktivieren, wenn Sie wollten, wohlgemerkt.
  • Es gibt keine Möglichkeit, Ihren Cache-Speicherort automatisch zu erkennen, also ist er einfach fest in der Datei codiert und Sie müssen ihn bearbeiten, um ihn zu ändern.
  • Im Idealfall würde es sich in andere gängige Cache-Programme einklinken (wenn möglich), so dass es sich löscht, wenn Sie den Cache in einem anderen Plugin manuell „leeren“, aber das tut es nicht. Wenn Sie also mit Inhalten kämpfen, die sich z.B. im W3TC nicht geändert haben, müssen Sie dort „Alle Caches leeren“ und dann auf die Optionsseite für dieses Plugin gehen und dasselbe tun.
  • Manuelles Löschen (wenn die automatische Löschung nicht funktioniert) muss von der Optionsseite aus erfolgen – keine Schaltfläche „Alle Caches leeren“.
  • …wahrscheinlich ein paar andere Dinge.

Ein paar Screenshots der Optionen-Seite (klicken Sie für eine größere Version):

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

Für den Fall, dass Sie es verpasst haben, laden Sie den Link erneut herunter (bitte lesen Sie die obigen Warnungen und nehmen Sie die Änderungen vor der Aktivierung vor).

Herunterladen: nginx-fastcgi-cache-purge.zip (v0.0.2)
(Sie können es in Ihre WordPress-Installation hochladen (über die Plugin-Seite), aber denken Sie daran, dass es von „levels=1:2“ ausgeht, und „/etc/nginx/cache/“ ist die Art und Weise, wie Sie die Dinge eingerichtet haben, da die meisten nginx-Anleitungen/Tutorials da draußen diese verwenden, aber Sie sollten es vor der Aktivierung auf die richtigen Werte editieren!)

Fühlen Sie sich frei, einen Kommentar zu hinterlassen, wenn es bei Ihnen funktioniert hat (oder auch nicht!).

7 Anmerkungen | Sagen Sie einen Kommentar

 Sortieren nach Ältestem | Sortieren nach neuestem
  1. Das Wordpress-Plugin funktioniert nicht mit meinem Nginx. Brauche ich zuerst ein nginx cache purge module? Ich versuche den gesamten Cache zu leeren, das Verzeichnis und die Dateien existierten immer noch. Hier ist der Screenshot http://i.imgur.com/1GTOwTj.jpg

    Mein Nginx-Benutzer ist mit meinem WordPress-Benutzer unter Linux identisch. Tu immer noch nichts und berübe diesen Cache nicht.
    • Hallo Beny. Das Plugin benötigt oder verwendet das Cache-Bereinigungsmodul nicht. Ich habe mir deinen Screenshot angesehen - versuche dem Pfad einen abschließenden Schrägstrich hinzuzufügen, so dass er /var/cache/nginx/mfit/ statt nur /var/cache/nginx/mfit ist. Wenn der Pfad korrekt ist, sollte er tatsächlich einige der zwischengespeicherten Beiträge auflisten und sagen, dass „_ mit Ihren Beiträgen/Seiten übereinstimmte und unten aufgeführt sind“. Da es mit nichts übereinstimmt, ist dies ein Hinweis darauf, dass der Pfad nicht korrekt ist.

      Lassen Sie es mich wissen, wenn Sie auf Probleme stoßen. Viel Glück!
  2. Nel auf August 11, 2015 - Klicken Sie hier, um zu antworten
    Hallo, ich verwende Proxy-Caching und es funktioniert für mich, aber das einzige Problem ist, dass Nginx immer eine nicht beschreibbare zwischengespeicherte Datei generiert und das Plugin keine zwischengespeicherten Dateien erkennen kann. Daher muss ich alle zwischengespeicherten Dateien auf 777 übertragen und das Plugin erkennen lassen.

    Wie können beschreibbare zwischengespeicherte Dateien von Nginx generiert werden?
    • Hallo Nel,

      Es besteht die Möglichkeit, dass nginx und PHP als verschiedene Benutzer laufen. Ein paar Optionen von oben auf meinem Kopf:

      - Führen Sie PHP und Nginx als den gleichen Benutzer aus (in den Konfigurationsdateien für beide). Sie müssen danach sicher sein, die entsprechenden Verzeichnisse zu chmoden, um sicherzustellen, dass sie die „alten Sachen“ lesen können, die sie unter den vorherigen Benutzerkonten (oder unter „niemand“) erstellt haben.

      -Ändern Sie Benutzer-/Gruppenberechtigungen, damit das aktuelle PHP-Benutzerkonto in die Cache-Dateien schreiben kann.

      -Schreiben Sie ein Shell/Bash-Skript (oder eine einfache Crontab, die jede Minute oder etwas ausgeführt wird), das den Cache-Ordner kontinuierlich überprüft und die Berechtigungen automatisch ändert. Dies ist wahrscheinlich die am wenigsten fehleranfällige Option, aber auch die klobigste.
      • Nel auf August 12, 2015 - Klicken Sie hier, um zu antworten
        Süß! Ich habe die Nginx-Benutzerberechtigungen wie PHP-Benutzer geändert, dann hat es funktioniert.

        Übrigens, hat Fastcgi-Cache das gleiche nicht beschreibbare Problem?
  3. Fantastischer Bericht, ich war genau auf der Suche nach diesem. Ich werde dies in einem Laravel-Projekt implementieren. Ich danke Ihnen so sehr.
  4. Trung Phan auf November 20, 2023 - Klicken Sie hier, um zu antworten
    Ich danke Ihnen vielmals. Dieses Plugin ist sehr nützlich.

Sagen Sie einen Kommentar

Sie können einen Alias und gefälschte E-Mails verwenden Wenn Sie sich jedoch für die Verwendung einer echten E-Mail entscheiden, werden "Gravatare" unterstützt. Lesen Sie die Datenschutzerklärung für weitere Details.