Dans le développement de PHP, le mécanisme tampon de sortie est souvent utilisé pour contrôler lorsque la sortie est envoyée au navigateur. Mais parfois, lorsque nous appelons la fonction ob_list_handlers () , nous rencontrerons des erreurs courantes, telles que "les en-têtes déjà envoyés" ou "sous-flux de pile de tampon", qui sont souvent confus.
Cet article vous amènera à comprendre pourquoi vous rencontrez ces erreurs et comment localiser et résoudre rapidement le problème.
ob_list_handlers () est une fonction intégrée PHP qui renvoie un tableau de tous les gestionnaires de tampons de sortie actuellement actifs (gestionnaires). Par exemple, lorsque vous utilisez ob_start () pour ouvrir un tampon, le gestionnaire sera poussé dans la pile.
Exemple simple:
<?php
ob_start();
print_r(ob_list_handlers());
ob_end_clean();
?>
La sortie peut être similaire:
Array
(
[0] => default output handler
)
Description du problème:
Si vous faites ob_end_clean () ou ob_end_flush () plusieurs fois dans le programme, mais il n'y a pas autant de tampons, il lancera quelque chose comme:
Warning: ob_end_clean(): failed to delete buffer. No buffer to delete
Analyse des causes:
En effet, la pile tampon est vide et la fonction de nettoyage inutile est appelée.
Correction rapide:
Vous pouvez vérifier si le tampon existe avant d'appeler le nettoyage:
<?php
if (ob_get_level() > 0) {
ob_end_clean();
}
?>
Ou plus élégamment encapsulé une fonction sûre:
<?php
function safeObEndClean() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
?>
Description du problème:
Avant de définir l'en-tête (tel que l'en-tête ('emplacement: https://gitbox.net/success') ), si un contenu a été sorti, PHP invite:
Warning: Cannot modify header information - headers already sent
Analyse des causes:
Parce qu'une fois qu'il y a la sortie (même un espace ou un caractère invisible), PHP pense qu'il a commencé à envoyer une réponse HTTP, et les informations d'en-tête de réglage sont invalides pour le moment.
Correction rapide:
Assurez-vous qu'il n'y a absolument aucun espace ou sortie au début du fichier PHP.
Démarrez la tampon de sortie et envoyez-le uniformément à la fin.
Par exemple:
<?php
ob_start();
// Traitement logique normal
header('Location: https://gitbox.net/welcome');
exit;
ob_end_flush();
?>
Remarque: la sortie est nécessaire après la redirection pour éviter l'exécution de code ultérieure.
Description du problème:
Lorsque vous utilisez ob_start ('inconnu_handler') , si un gestionnaire inexistant est spécifié, PHP rapportera une erreur:
Warning: ob_start(): output handler 'unknown_handler' cannot be used
Analyse des causes:
Le nom du gestionnaire doit être connu de PHP (comme OB_GZHandler pour la compression GZIP), sinon une erreur sera lancée.
Correction rapide:
Confirmez si le processeur existe et s'inscrivez à nouveau:
<?php
if (function_exists('ob_gzhandler')) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
?>
Lorsqu'une page complexe est rencontrée, lorsque la mise en mémoire tampon est activée et désactivée plusieurs fois, vous pouvez utiliser ob_list_handlers () pour imprimer la pile de processeur tampon actuelle pour nous aider à confirmer la relation d'appel.
Exemple:
<?php
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
ob_end_flush();
ob_end_flush();
?>
Sortir:
Array
(
[0] => ob_gzhandler
[1] => default output handler
)
Faites des appels ob_end _ * () en fonction de l'ordre de pile pour éviter la confusion.
J'ai rencontré des erreurs liées à OB_LIST_HANDLErs , la plupart du temps, cela était dû à une mauvaise gestion des tampons ou à une mauvaise synchronisation de sortie. Ce type de problème peut être évité efficacement en utilisant correctement ob_get_level () pour vérifier l'état et la gestion raisonnablement du tampon de sortie. Lors du débogage, utiliser ob_list_handlers () pour observer la situation de pile de tampon en temps réel est un outil puissant pour positionner rapidement les problèmes.