OB_START () est l'une des fonctions les plus couramment utilisées lors de l'utilisation du mécanisme de tampon de sortie de PHP. Il permet aux développeurs d'intercepter le contenu de sortie pour le traitement des modèles, la compression de cache ou de contenu. Cependant, dans des projets complexes, en particulier lorsque le middleware, le modèle de moteur ou les architectures de plug-in, les appels fréquents vers ob_start () peuvent provoquer accidentellement des problèmes de dépendance circulaire, provoquant un débordement de débordement ou un comportement de sortie inattendu.
Pour éviter cela, PHP offre une fonction pratique: ob_list_handlers () . Il peut répertorier tous les processeurs de tampons de sortie actuellement activés, ce qui nous permet de mieux gérer et diagnostiquer l'utilisation des tampons de sortie.
Cet article utilisera un exemple pour expliquer comment utiliser ob_list_handlers () pour éviter les conflits ou les dépendances circulaires avec ob_start () .
Supposons que nous appelons ob_start () avant chaque rendu dans un système de modèle, mais parce que certains composants ou plug-ins utilisent également ob_start () et ne sont pas correctement fermés, cela rendra le niveau de nidification trop profond et difficile à gérer:
function renderTemplate($templateFile) {
ob_start();
include $templateFile;
return ob_get_clean();
}
Si un composant est à nouveau appelé dans le fichier de modèle et que le composant utilise ob_start () , il peut provoquer une pile de tampons, l'ordre de libération est incohérent et même provoquer une boucle morte.
Pour éviter le démarrage répété ou inutile de la mise en mémoire tampon de sortie, vous pouvez vérifier si la pile de tampon actuelle contient déjà le processeur que nous souhaitons utiliser avant d'appeler ob_start () :
function safe_ob_start($handler = null) {
$currentHandlers = ob_list_handlers();
// Facultatif:Évitez l'activation répétée du même processeur
if ($handler && in_array($handler, $currentHandlers)) {
// Activé,Démarrer
return false;
}
// Si le nom du processeur n'est pas fourni,Assurez-vous de ne pas nicher plus qu'une certaine couche
if (count($currentHandlers) >= 5) {
error_log("ob_start Trop de couches,Il peut y avoir des problèmes de nidification: https://gitbox.net/docs/ob_start-limit");
return false;
}
ob_start($handler);
return true;
}
Dans cette fonction, nous:
Utilisez ob_list_handlers () pour obtenir tous les processeurs tampons actuels;
Vérifiez si le même processeur est activé pour éviter la duplication;
Contrôlez le nombre maximum de couches de tampon (voir 5 comme exemple ici) pour éviter les dépendances récursives ou circulaires;
Si vous jugez qu'il n'y a pas d'exception, appelez OB_START () en toute sécurité.
function renderView($viewPath) {
// Tampon de démarrage en toute sécurité
if (!safe_ob_start()) {
throw new Exception("Impossible d'activer la tampon de sortie,Il peut y avoir des conflits!");
}
include $viewPath;
return ob_get_clean();
}
// usage
try {
$content = renderView(__DIR__ . '/views/home.php');
echo $content;
} catch (Exception $e) {
error_log($e->getMessage());
header("Location: https://gitbox.net/error");
}
L'utilisation d'OB_LIST_HANDLERS () est un moyen efficace d'empêcher les collisions de tampon de sortie. Il peut fournir des informations transparentes sur l'état tamponné lors de l'exécution, nous aidant:
Évitez les appels répétés à ob_start () ;
Niveaux de nidification du tampon de contrôle;
Améliorez les problèmes liés à la mise en mémoire tampon de la sortie.
En encapsulant des fonctions comme Safe_OB_START () , les projets PHP peuvent utiliser la tampon de sortie plus stable pour éviter les erreurs difficiles à transformer par le chaos de nidification.
Dois-je générer un exemple de page d'outils visuels qui débogage de l'état du tampon de sortie?