Aktueller Standort: Startseite> Neueste Artikel> So vermeiden Sie mehrere Ausgabe -Caches, wenn Sie OB_LIST_HANDLERS verwenden

So vermeiden Sie mehrere Ausgabe -Caches, wenn Sie OB_LIST_HANDLERS verwenden

gitbox 2025-05-14

Bei Verwendung von PHP -Ausgabemechanismus verwenden wir häufig Funktionen wie Ob_Start () und ob_get_contents (), um die Ausgabe des Inhalts zu steuern. Diese Tools sind in Template -Motoren, Cache -Generierung, Seitenkomprimierung und anderen Szenarien sehr häufig. Wenn dies jedoch versehentlich gehandhabt wird, kann dies mehrmals zwischen zwischengespeichertem Inhalt ausgegeben werden, was sich auf die normale Anzeige der Seite auswirkt.

Eine der praktischen, aber leicht übersehenen Funktionen ist ob_list_handllers () . Es hilft uns, alle derzeit aktivierten Pufferhandler anzusehen. Wenn Sie es korrekt verwenden, können Sie das Problem des wiederholten Ausgangspuffers effektiv vermeiden.

1. Das Grundprinzip der Ausgangspufferung

Mit dem Ausgangspuffer von PHP können wir den Ausgangsinhalt in den Speicher speichern, bis das manuelle Flush abgeschlossen ist oder das Skript einheitlich ausgegeben wird. Dies kann uns helfen:

  • Ändern Sie die HTTP -Headerinformationen, bevor Sie den Inhalt ausgeben.

  • Kontrollinhalte zwischengespeicherter Inhalt;

  • Komprimieren oder filtern Sie den Ausgangsinhalt.

Die grundlegenden Nutzungsbeispiele sind wie folgt:

 ob_start();
echo "Hello, World!";
$content = ob_get_contents();
ob_end_clean();

In diesem Code "Hallo, Welt!" wird in den Puffer ausgegeben und wird dann als Variable $ -Halt extrahiert, und der Puffer wird über OB_END_CLEAN () gelöscht, um zu vermeiden, dass direkt ausgegeben wird.

2. Die Rolle von OB_LIST_HANDLERS ()

OB_LIST_HANDLERS () gibt alle aktuellen Ausgabebuffer -Prozessornamen zurück, was ein leistungsstarkes Werkzeug ist, um die doppelte Ausgabe zu beheben.

Zum Beispiel:

 ob_start();
ob_start('ob_gzhandler');

print_r(ob_list_handlers());

Die Ausgabe kann wie folgt sein:

 Array
(
    [0] => ob_gzhandler
    [1] => default output handler
)

Jeder Prozessor verarbeitet die gepufferte Ausgabe auf Stapel. Wenn Sie den alten Puffer nicht reinigen, kann der Inhalt wiederholt komprimiert oder ausgegeben werden.

3. Wie kann man mehrmals einen Cache -Ausgang vermeiden?

In komplexen Projekten verwenden wir in der Regel mehrere Komponenten, die alle ihre eigene Ausgangspufferung einschalten können. Wenn die Pufferebene nicht einheitlich ist, können die folgenden Probleme leicht auftreten:

  • Cache -Inhaltsausgabe mehrmals;

  • Die Ausgangsreihenfolge ist inkonsistent;

  • Die Pufferung wird nicht korrekt geschlossen, verursacht Speicherlecks.

Lösung 1: Bestimmen Sie, ob die Pufferung eingeschaltet wurde

Verwenden Sie OB_Get_Level (), um die aktuelle Pufferebene zu erkennen und wiederholte Anrufe zu vermeiden:

 if (ob_get_level() === 0) {
    ob_start();
}

Lösung 2: Verwenden Sie OB_LIST_HANDLERS (), um die Beurteilung des Deduplikationsurteils zu fällen

Sie können eine Helferfunktion schreiben, um festzustellen, ob ein bestimmter Prozessor aktiviert wurde, z. B.:

 function has_ob_handler($handler_name) {
    return in_array($handler_name, ob_list_handlers());
}

if (!has_ob_handler('ob_gzhandler')) {
    ob_start('ob_gzhandler');
}

Dieser Code verhindert, dass OB_GZHandler wiederholt registriert wird, wodurch die Ausgabe mehrmals von GZIP komprimiert wird.

Lösung 3: Einheitliches Abschalten aller Puffer

Wenn Sie nicht sicher sind, welche Puffer eingeschaltet sind, können Sie die folgenden Methoden verwenden, um sie zu löschen:

 while (ob_get_level() > 0) {
    ob_end_clean();
}

Dies wird häufig in Frameworks oder Kerncontrollern verwendet, um zu verhindern, dass verschachtelte Pufferpegel Probleme verursachen.

4. Tatsächlicher Fall: Cache -HTML -Seiteninhalt Cache

 $url = 'https://gitbox.net/cache/homepage.html';

// Beginnen Sie pufferend
if (ob_get_level() === 0) {
    ob_start();
}

// Analoginhaltsausgabe
echo "<h1>Willkommen zu Besuch Gitbox</h1>";

// Speichern Sie zwischengespeicherten Inhalten
$content = ob_get_contents();
file_put_contents('/path/to/cache/homepage.html', $content);

// Endpufferung,Ausgabeinhalt
ob_end_flush();

Wenn das Skript mehrmals aufgerufen wird (z.

Zusammenfassen

Durch die Verwendung von OB_LIST_HANDLERS () können wir den aktuellen Ausgangspufferstatus klar verstehen und ein wichtiges Instrument zum Auffinden und Behebung von zwischengespeichertem doppelten Ausgangsproblemen sind. Mit Funktionen wie ob_get_level () und ob_end_clean () kann die Ausgangspufferung von PHP sicherer und effizienter verwaltet werden, insbesondere bei Verwendung von Vorlagenmotoren, Erstellen von Caches oder Verarbeitung von GZIP -Ausgabe.

Es wird empfohlen, die Ausgangspufferlogik in großen Projekten oder Multi-Modul-Systemen zu vereinheitlichen, um das Konfliktrisiko zu verringern und den Inhaltsausgang steuerbarer und effizienter zu gestalten.

Müssen Sie eine vollständige Kapselung der Pufferverwaltungsklasse als Referenz anbieten?