Bei der PHP -Entwicklung wird der Ausgangspufferungsmechanismus häufig verwendet, um zu steuern, wenn die Ausgabe an den Browser gesendet wird. Wenn wir jedoch die Funktion OB_List_handlers () aufrufen, werden wir auf einige häufige Fehler stoßen, wie z.
In diesem Artikel werden Sie verstehen, warum Sie auf diese Fehler stoßen und wie Sie das Problem schnell finden und beheben können.
OB_LIST_HANDLERS () ist eine PHP-integrierte Funktion, die ein Array aller aktuell aktiven Ausgangspufferhandler (Handler) zurückgibt. Wenn Sie beispielsweise Ob_Start () verwenden, um einen Puffer zu öffnen, wird der Handler in den Stapel gedrückt.
Einfaches Beispiel:
<?php
ob_start();
print_r(ob_list_handlers());
ob_end_clean();
?>
Die Ausgabe kann ähnlich sein:
Array
(
[0] => default output handler
)
Problembeschreibung:
Wenn Sie OB_END_CLEAN () oder OB_END_FLUSH () im Programm mehrmals tun, aber es gibt nicht so viele Puffer, dass es so etwas wie folgt:
Warning: ob_end_clean(): failed to delete buffer. No buffer to delete
Ursache Analyse:
Dies liegt daran, dass der Pufferstapel leer ist und die unnötige Reinigungsfunktion aufgerufen wird.
Schnelle Lösung:
Sie können überprüfen, ob der Puffer vor dem Aufrufen von Reinigung vorhanden ist:
<?php
if (ob_get_level() > 0) {
ob_end_clean();
}
?>
Oder eleganterer eine sichere Funktion:
<?php
function safeObEndClean() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
?>
Problembeschreibung:
Vor dem Einstellen des Headers (z. B. Header ('Ort: https://gitbox.net/success') ), wenn Inhalte ausgegeben wurden, fordert PHP auf:
Warning: Cannot modify header information - headers already sent
Ursache Analyse:
Denn sobald es eine Ausgabe gibt (sogar einen Raum oder ein unsichtbares Zeichen), wird PHP der Ansicht, dass es mit dem Versenden einer HTTP -Antwort begonnen hat, und die Headerinformationen der Einstellung sind derzeit ungültig.
Schnelle Lösung:
Stellen Sie sicher, dass zu Beginn der PHP -Datei absolut keine Leerzeichen oder Ausgaben vorhanden sind .
Starten Sie die Ausgangspufferung und senden Sie es am Ende gleichmäßig.
Zum Beispiel:
<?php
ob_start();
// Normale Logikverarbeitung
header('Location: https://gitbox.net/welcome');
exit;
ob_end_flush();
?>
HINWEIS: Der Ausgang ist nach der Umleitung erforderlich, um eine nachfolgende Codeausführung zu vermeiden.
Problembeschreibung:
Bei der Verwendung von OB_Start ('unbekannt_handler') meldet PHP einen Fehler, wenn ein nicht existierender Handler angegeben ist:
Warning: ob_start(): output handler 'unknown_handler' cannot be used
Ursache Analyse:
Der Handler -Name muss PHP (z. B. OB_Gzhandler für die Gzip -Komprimierung) bekannt sein, andernfalls wird ein Fehler geworfen.
Schnelle Lösung:
Bestätigen Sie, ob der Prozessor existiert, und registrieren Sie sich erneut:
<?php
if (function_exists('ob_gzhandler')) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
?>
Wenn eine komplexe Seite auftritt, können Sie beim mehrmaligen Ein- und Ausschalten der Pufferung OB_List_handlers () verwenden, um den aktuellen Pufferprozessor -Stack zu drucken, um uns zu helfen, die Anrufbeziehung zu bestätigen.
Beispiel:
<?php
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
ob_end_flush();
ob_end_flush();
?>
Ausgabe:
Array
(
[0] => ob_gzhandler
[1] => default output handler
)
Treffen Sie OB_end _*() Anrufe gemäß der Stapelordnung, um Verwirrung zu vermeiden.
Ich habe OB_LIST_HANDLERS -verwandte Fehler begegnet, die meiste Zeit auf eine unsachgemäße Pufferverwaltung oder ein falsches Ausgangszeitpunkt zurückzuführen war. Diese Art von Problem kann effektiv vermieden werden, indem sie OB_get_Level () korrekt korrekt überprüft und den Ausgangspuffer vernünftig verwaltet. Beim Debuggen ist es ein leistungsstarkes Werkzeug für die schnelle Positionierungsprobleme, wenn Sie OB_LIST_HANDLERS () in Echtzeit beobachten, um die Situation der Pufferstapel in Echtzeit zu beobachten.