In der PHP -Entwicklung ist Output -Pufferung eine sehr wichtige Technologie, mit der Entwickler den Ausgangsinhalt flexibler steuern können. Wenn wir jedoch die Ausgangspufferung verwalten, verwenden wir häufig die beiden Funktionen ob_list_handlers () und ob_end_flush () . Wenn diese beiden Funktionen nicht ordnungsgemäß verwendet werden, können einige häufige Probleme auftreten. In diesem Artikel wird systematisch die Funktionen, gemeinsamen Probleme und Lösungen dieser beiden Funktionen eingeführt.
OB_LIST_HANDLERS () wird verwendet, um alle derzeit aktivierten Ausgabepufferprozessoren aufzulisten. Es gibt ein Array mit Prozessornamen zurück, die in der Reihenfolge der Schöpfung sortiert sind. Zum Beispiel:
$handlers = ob_list_handlers();
print_r($handlers);
Die Ausgabe kann ähnlich sein wie mit:
Array
(
[0] => default output handler
[1] => URL-Rewriter
)
Wenn es keinen aktivierten Puffer gibt, wird ein leeres Array zurückgegeben.
OB_END_FLUSH () wird verwendet, um den aktuellen Ausgangspufferinhalt zu spülen (zu senden) und den Puffer zu schließen. Wenn es keinen aktiven Puffer gibt, erzeugt die Funktion eine Warnung.
Beispiel:
ob_start();
echo "Hello, GitBox!";
ob_end_flush();
Nach der Ausführung "Hallo, Gitbox!" wird sofort an den Browser gesendet.
In der tatsächlichen Entwicklung können Sie bei Verwendung von OB_LIST_HANTLERS () und OB_END_FLUSH () in Kombination auf die folgenden Probleme stoßen:
Wenn Sie OB_END_FLUSH () anrufen, wird eine Warnung angehoben, wenn kein Puffer vorhanden ist:
Warning: ob_end_flush(): failed to delete buffer. No buffer to delete
Gemeinsame Szenarien:
if (!empty(ob_list_handlers())) {
ob_end_flush();
} else {
// Kein Puffer,unnötigflush
}
Wenn OB_end_flush () direkt aufgerufen wird, ohne zu überprüfen, ob ein Puffer vorliegt, ist es einfach, Fehler zu machen.
Lösung:
Überprüfen Sie, ob ein Puffer vorhanden ist, bevor Sie ob_end_flush () aufrufen:
if (ob_get_level() > 0) {
ob_end_flush();
}
ob_get_level () gibt die Anzahl der Ebenen im aktuellen Puffer zurück. Wenn es größer als 0 ist, bedeutet dies, dass es einen Puffer gibt.
In komplexen Anwendungen, beispielsweise bei Verwendung von Frameworks- oder Drittanbieterbibliotheken, gibt es häufig mehrere Pufferebenen. Wenn Sie einfach ob_end_flush () aufrufen, können Sie nur die aktuelle Ebene verarbeiten und der verbleibende Puffer ist noch da.
Beispiel:
while (ob_get_level() > 0) {
ob_end_flush();
}
Auf diese Weise können alle Ausgangspuffer schicht für Schicht geschlossen werden, sodass sichergestellt wird, dass nicht der Inhalt nicht zurückgelassen wird.
Einige Ausgangspuffer können an spezielle Prozessoren gebunden sein (z. B. GZIP -Komprimierung oder URL -Umschreiben). Die erzwungene Beendigung dieser Puffer kann dazu führen, dass die Ausgabe beschädigt wird, z. B. verstümmelte Webseiten, Inhaltskodierfehler usw.
Wie man es elegant damit umgeht:
Überprüfen Sie den Puffertyp über OB_LIST_HANDLERS () und schließen Sie nur die Puffer, die Sie sicher verarbeiten können. Vermeiden Sie beispielsweise das Schließen von Puffern wie gzip_handler .
$handlers = ob_list_handlers();
foreach ($handlers as $handler) {
if ($handler === 'default output handler') {
ob_end_flush();
}
}
Dies verringert das Risiko, versehentlich eine andere Ausgangslogik zu brechen.
Hier ist ein vollständiges Beispiel für einen sicheren Operationspuffer , der OB_LIST_HANDLERS () und OB_END_FLUSH () kombiniert:
// Starten Sie einen Ausgangspuffer
ob_start();
// Ausgabeinhalt
echo "Besuchen Sie unsere Website:https://gitbox.net/welcome";
// Überprüfen Sie den Puffer und schließen Sie ihn sicher
$handlers = ob_list_handlers();
if (!empty($handlers)) {
foreach ($handlers as $handler) {
if ($handler === 'default output handler') {
ob_end_flush();
}
}
}
Wenn in diesem Beispiel ein Puffer für den Standardausgangsprozessor vorhanden ist, aktualisieren und schließen Sie ihn, während sichergestellt wird, dass der von andere Systeme festgelegte Puffer nicht zerstört wird.
In PHP kann uns OB_ILLIST_HANDLERS () die aktuelle Ausgangspufferungssituation verstehen lassen, während OB_END_FLUSH () zum Senden und Ausschalten der Ausgabepufferung verwendet werden kann. Es ist sehr wichtig, diese beiden Funktionen korrekt zu entsprechen, ansonsten ist es einfach, Warnungen, Seitenausnahmen und sogar logische Fehler zu verursachen.
Machen Sie sich unbedingt an:
Bestätigen Sie, dass der Puffer vor OB_END_FLUSH () existiert.
Seien Sie vorsichtig, wenn Sie mit mehrschichtiger Pufferung umgehen.
Vermeiden Sie es, Ausgangspuffer zu zerstören, die nicht von sich selbst kontrolliert werden.
Wenn Sie die Verwendung dieser beiden Funktionen beherrschen, kann Ihr PHP -Projekt im Ausgabemanagement robuster und zuverlässiger werden!