In PHP ist Output -Pufferung ein leistungsstarker Mechanismus, mit dem Entwickler Inhalte im Speicher sparen können, bevor sie tatsächlich an den Browser ausgegeben werden. Dies ist besonders nützlich, wenn der Ausgang geändert, komprimiert oder gefiltert werden muss. Bei Verwendung von Ausgangspufferhandlern (z. B. von von OB_Start () registrierten Rückrufe) stoßen Entwickler häufig auf ein Problem: Mehrere Pufferhandlerkonflikte, was zu Ausnahmen oder logischer Verwirrung führt.
In diesem Artikel wird eingehend erläutert, wie man OB_LIST_HANDLERS () verwendet, um zu identifizieren, welche Handler im aktuellen Pufferstapel enthalten sind und wie Konflikte zwischen Pufferhandlern vermieden und behoben werden können.
Der Ausgangspuffer von PHP wird über OB_Start () eingeschaltet und der Ausgang wird vorübergehend gespeichert. Wenn der Puffer geschlossen ist (z. B. das Aufrufen von ob_end_flush () ), wird der Inhalt verarbeitet und gemäß dem registrierten Prozessor ausgegeben.
ob_start(); // Schalten Sie einen prozessorfreien Puffer ein
echo "Hello, world!";
$content = ob_get_clean(); // Holen Sie sich den gepufferten Inhalt und schalten Sie die Pufferung aus
Sie können auch eine Verarbeitungsfunktion übergeben, um den Pufferinhalt zu verarbeiten:
function compress_output($buffer) {
return gzencode($buffer);
}
ob_start("compress_output");
echo "This is the original content.";
ob_end_flush();
Wenn OB_Start () im Programm mehrmals verwendet wird, ist es einfach, unklar zu sein, welche Prozessoren derzeit ausgeführt werden. OB_LIST_HANDLERS () ist ein Tool, mit dem alle aktuellen Pufferhandler angezeigt werden.
ob_start("strtoupper");
ob_start("urlencode");
print_r(ob_list_handlers());
Die Ausgabe ist ähnlich:
Array
(
[0] => urlencode
[1] => strtoupper
)
Es ist zu beachten, dass das Rückgabeergebnis von OB_LIST_HANDLERS () in der Reihenfolge von "Stack" angeordnet ist und die hinzugefügten Pufferprozessoren zuerst eingestuft werden.
Wenn Sie denselben Prozessor an mehreren Stellen wiederverwenden, z. B. die Verwendung von OB_Start ("ob_gzhandler") für mehrere Module, wird dies mehrmals und Inhaltsfehler auftreten.
Lösung:
Stellen Sie fest, ob es bereits vorhanden ist, bevor Sie den Prozessor registrieren:
if (!in_array('ob_gzhandler', ob_list_handlers())) {
ob_start('ob_gzhandler');
}
Einige Frameworks oder Bibliotheken von Drittanbietern können standardmäßig ihre eigene Ausgabeverarbeitung ermöglichen, wie z. B. Komprimierung oder Vorlagenrendern. Der Prozessor, den Sie manuell hinzufügen, ist möglicherweise unvereinbar.
Beispielfragescode:
ob_start("custom_handler"); // Ihr benutzerdefinierter Prozessor
// Gleichzeitig im Framework hinzugefügt ob_gzhandler
Dies kann zu einem verstümmelten Ausgangs- oder HTTP -Header -Konflikt führen.
Lösung:
Unified Management of Output Puffer Startup -Logik, fügen Sie Urteile in das Skript für Eintragsdatei oder Initialisierung hinzu:
function safe_ob_start($handler) {
if (!in_array($handler, ob_list_handlers())) {
ob_start($handler);
}
}
Nach der Registrierung mehrerer Prozessoren kann der Prozessor nicht in der richtigen Reihenfolge in die richtige Reihenfolge aufgerufen werden, wenn OB_end_flush () oder ob_end_clean () nicht aufgerufen wird.
Best Practice: Unified Buffer Stack Management
function clear_all_buffers() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
Rufen Sie diese Funktion auf, bei der alle Puffer gezwungen werden müssen, um zu reinigen, um eine Umgebung für saubere Ausgaben zu gewährleisten.
function register_output_handler($handler) {
if (!in_array($handler, ob_list_handlers())) {
ob_start($handler);
} else {
error_log("Prozessor $handler Eingetragen,über etwas springen。");
}
}
// Angenommen, der Inhalt muss komprimiert und ersetzt werden
function replace_and_compress($buffer) {
$buffer = str_replace("example.com", "gitbox.net", $buffer);
return gzencode($buffer);
}
// 注册Prozessor
register_output_handler("replace_and_compress");
echo "Willkommen zu Besuch:https://example.com/page";
// Der endgültige Ausgangsinhalt
ob_end_flush();
In komplexen PHP -Anwendungen können mehrere Module oder Bibliotheken gleichzeitig Ausgabepufferprozessoren verwenden, und Konflikte sind anfällig für unsachgemäße Verwaltung. Mit OB_LIST_HANDLERS () können wir den aktuell registrierten Prozessor deutlich sehen und Urteile fällen, wenn sie einen neuen Prozessor registrieren, um eine wiederholte Registrierung oder Verwirrung nacheinander zu vermeiden.
Mit einem guten Puffer -Stack -Management und Prozessorregistrierungsstrategien können die Stabilität und Wartbarkeit von PHP -Projekten erheblich verbessert werden.