In der PHP -Programmierung ist OB_CLEAN () eine gemeinsame Funktion für Ausgabepufferverwaltung. Sein Zweck ist es, den aktuellen Ausgangspuffer zu löschen, aber den Pufferinhalt nicht auszugeben. Viele Entwickler begegnen das Problem der Arbeitslosigkeit von Cache bei der Verwendung von ob_clean () . Dieses Phänomen kann Entwickler verwirren. Warum existiert der Pufferinhalt noch nach dem Aufrufen dieser Funktion?
In diesem Artikel werden wir uns mit der Funktionsweise von Ob_Clean () befassen, gemeinsame Missverständnisse analysieren, die eine Cache -Arbeitslosigkeit verursachen und einige praktische Lösungen liefern.
In PHP ermöglicht der Ausgangspufferungsmechanismus die Ausgabedaten (z. B. HTML, Text oder Fehlermeldungen), die vorübergehend in einen Speicherpuffer gespeichert werden können, anstatt direkt an den Browser gesendet zu werden. Der Vorteil dieses Mechanismus besteht darin, dass Sie die Ausgabe während der Skriptausführung ändern oder steuern können, wenn die Ausgabe unter bestimmten Bedingungen an den Browser gesendet wird.
Die Funktion OB_Clean () wird verwendet, um den Inhalt des aktuellen Puffers zu löschen. Wenn diese Funktion aufgerufen wird, wird der Inhalt im Puffer verworfen, aber es werden keine Daten ausgegeben.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// Ausgangspufferung starten</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Löschen Sie den Puffer</span></span><span>
</span><span><span class="hljs-comment">// Hier wird nichts ausgegeben,Weil der Puffer gelöscht wird</span></span><span>
</span></span>
Es ist zu beachten, dass Ob_Clean () nur den aktuell aktiven Ausgangspuffer löscht. Wenn kein aktiver Puffer vorhanden ist oder wenn keine Daten gepuffert werden, wenn der Anruf aufgerufen wird, hat dies keine Wirkung.
Obwohl Ob_Clean () im Dokument klar definiert ist, begegnen Entwickler häufig auf folgende Missverständnisse, was sie zu der Annahme veranlasst, dass der Cache nicht geklärt wurde:
Wenn OB_Start () nicht zuerst aufgerufen wird, um den Ausgangspufferungsmechanismus zu starten, hat es keinen Einfluss , obs_clean () aufzurufen. In PHP kann Ob_Clean () den Puffer erst nach dem Start des Ausgangspuffers löschen.
<span><span><span class="hljs-comment">// Fehlerdemonstration:未Ausgangspufferung starten</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Hier wird es keinen Einfluss geben,Weil es keinen Puffer gibt</span></span><span>
</span></span>
Der richtige Weg, dies zu tun, ist:
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// Starten Sie den Puffer</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 这里才会Löschen Sie den Puffer</span></span><span>
</span></span>
PHP unterstützt eine verschachtelte Ausgangspufferung. Wenn die korrekte Pufferniststruktur nicht verarbeitet wird, wenn OB_Clean () aufgerufen wird, kann dies dazu führen, dass der falsche Puffer gelöscht wird, anstatt dass der Puffer, den Sie erwarten, gelöscht werden kann. Der Ausgangspuffer von PHP ist stackbasiert, sodass Sie möglicherweise OB_end_Clean () verwenden müssen, um den obersten Puffer zu beenden und zu löschen.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// Starten Sie den Puffer</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"First output"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 再次Starten Sie den Puffer</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Second output"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Nur der zweite Puffer wird gelöscht,Wird den ersten nicht klarstellen</span></span><span>
</span><span><span class="hljs-comment">// Müssen anrufen ob_end_clean() Den äußersten Puffer löschen</span></span><span>
</span></span>
Wenn der Ausgangspuffer an den Browser gesendet wurde, kann Ob_Clean () den gesendeten Inhalt nicht löschen. PHP sendet automatisch Pufferinhalte an den Browser, wenn sie fertig sind und die Ausgabe ausgelöst wird. Dies geschieht normalerweise, wenn Flush () aufgerufen wird oder das Skript automatisch endet.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>(); </span><span><span class="hljs-comment">// Ausgabepufferinhalt in den Browser ausgeben</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Zu dieser Zeit gerufen ob_clean() Ungültig,Weil der Inhalt gesendet wurde</span></span><span>
</span></span>
Die Lösung besteht darin, die Ausgabe des Puffergehalts zu früh zu vermeiden oder den Ausgangspuffer direkt mit OB_END_CLEAN () zu beenden, anstatt ihn zu löschen, wenn er ausgegeben wurde.
Wenn Sie eine Rückruffunktion angeben, um den Pufferinhalt in ob_start () zu verarbeiten, wird das von OB_CLEAN () gelöscht, der vom Rückruf verarbeitete Inhalt. Wenn es in der Rückruffunktion Fehler oder logische Probleme gibt, kann dies dazu führen, dass der Puffer nicht gelöscht wurde.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">custom_callback</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$buffer</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$buffer</span></span><span>); </span><span><span class="hljs-comment">// Pufferinhalt in Großbuchstaben konvertieren</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(</span><span><span class="hljs-string">"custom_callback"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Löschen Sie den Puffer,Aber wegen der Rückruffunktion,Inhalt wurde möglicherweise geändert</span></span><span>
</span></span>
Es gibt viele andere Arten von Caching -Mechanismen in PHP (wie Opcache, Datenbankabfrage -Cache usw.), die nichts mit Ausgabepufferung zu tun haben. Daher löscht Ob_Clean () nur den Ausgangspuffer von PHP, ohne andere Caches -Arten zu beeinflussen.
Um die oben genannten Missverständnisse zu vermeiden, sollten Entwickler den folgenden Best Practices folgen:
Stellen Sie sicher, dass der Ausgangspuffer korrekt gestartet wird : Bevor Sie OB_CLEAN () aufrufen, starten Sie zuerst den Ausgangspuffer.
Verstehen Sie die Puffer-Stack-Struktur : Wenn Sie verschachtelte Puffer verwenden, stellen Sie sicher, dass Sie den korrektsten Puffer löschen, oder verwenden Sie OB_END_CLEAN (), um den oberen Puffer zu löschen.
Vermeiden Sie es im Voraus, Inhalte auszugeben : Wenn Sie den Inhalt des Puffers nicht ausgeben, bevor Sie ob_clean () oder ob_end_clean () aufrufen, und vermeiden Sie es, Flush () anzurufen.
Überprüfen Sie die Rückruffunktion : Wenn Sie eine benutzerdefinierte Ausgangspufferverarbeitungsfunktion verwenden, stellen Sie sicher, dass die Logik korrekt ist und den Effekt von OB_CLEAN () nicht beeinträchtigt.
Durch das Verständnis dieser Details können Sie die PHP -Ausgangspufferung effektiver verwalten und Cache -Leere und Ungültigkeit vermeiden.