Position actuelle: Accueil> Derniers articles> Comment éviter plusieurs caches de sortie lors de l'utilisation de l'OB_LIST_HANDLERS

Comment éviter plusieurs caches de sortie lors de l'utilisation de l'OB_LIST_HANDLERS

gitbox 2025-05-14

Lorsque nous utilisons le mécanisme de mémoire tampon de sortie de PHP, nous utilisons souvent des fonctions telles que ob_start () et ob_get_contents () pour contrôler la sortie du contenu. Ces outils sont très courants dans les moteurs de modèle, la génération de cache, la compression de pages et d'autres scénarios. Cependant, si elle est gérée accidentellement, elle peut entraîner la sortie du contenu en cache plusieurs fois, ce qui affectera l'affichage normal de la page.

L'une des fonctions pratiques mais facilement négligées est ob_list_handlers () . Il nous aide à visualiser tous les gestionnaires de tampons actuellement activés. L'utiliser correctement peut éviter efficacement le problème de la sortie du tampon de sortie.

1. Le principe de base de la tampon de sortie

Le tampon de sortie de PHP nous permet d'enregistrer le contenu de sortie dans la mémoire jusqu'à ce que la rinçage manuel soit terminée ou que le script soit sortie uniformément. Cela peut nous aider:

  • Modifiez les informations d'en-tête HTTP avant de sortir le contenu;

  • Contrôler le contenu mis en cache;

  • Comprimer ou filtrer le contenu de sortie.

Les exemples d'utilisation de base sont les suivants:

 ob_start();
echo "Hello, World!";
$content = ob_get_contents();
ob_end_clean();

Dans ce code, "Bonjour le monde!" est sorti dans le tampon, puis est extrait sous forme de contenu variable $ , et le tampon est effacé via ob_end_clean () pour éviter d'être sorti directement.

2. Le rôle de ob_list_handlers ()

ob_list_handlers () renvoie tous les noms de processeur de tampon de sortie actuels, qui est un outil puissant pour dépanner la sortie en double.

Par exemple:

 ob_start();
ob_start('ob_gzhandler');

print_r(ob_list_handlers());

La sortie peut être la suivante:

 Array
(
    [0] => ob_gzhandler
    [1] => default output handler
)

Chaque processeur traite la sortie tamponnée d'une manière de pile. Si vous ne nettoyez pas l'ancien tampon, le contenu peut être comprimé à plusieurs reprises ou de sortie.

3. Comment éviter la sortie du cache plusieurs fois?

Dans des projets complexes, nous avons tendance à utiliser plusieurs composants, ce qui peut tous activer leur propre tampon de sortie. Si le niveau de tampon n'est pas unifié, les problèmes suivants sont facilement rencontrés:

  • Cache contenu Sortie plusieurs fois;

  • L'ordre de sortie est incohérent;

  • La mise en mémoire tampon n'est pas fermée correctement, entraînant des fuites de mémoire.

Solution 1: Déterminez si la mise en mémoire tampon a été activée

Utilisez ob_get_level () pour détecter le niveau de tampon actuel et éviter les appels répétés:

 if (ob_get_level() === 0) {
    ob_start();
}

Solution 2: Utilisez ob_list_handlers () pour porter un jugement de déduplication

Vous pouvez écrire une fonction d'assistance pour détecter si un processeur spécifique a été activé, tel que:

 function has_ob_handler($handler_name) {
    return in_array($handler_name, ob_list_handlers());
}

if (!has_ob_handler('ob_gzhandler')) {
    ob_start('ob_gzhandler');
}

Ce code empêche l'OB_GZHandler d'être enregistré à plusieurs reprises, évitant ainsi que la sortie est compressée par GZIP plusieurs fois.

Solution 3: Arrêt unifié de tous les tampons

Si vous ne savez pas quels tampons sont activés, vous pouvez utiliser les méthodes suivantes pour les effacer:

 while (ob_get_level() > 0) {
    ob_end_clean();
}

Ceci est souvent utilisé dans les cadres ou les contrôleurs de base pour empêcher les niveaux de tampon imbriqués de causer des problèmes.

4. Cas réel: Cache HTML Page Contenu

 $url = 'https://gitbox.net/cache/homepage.html';

// Commencer de tamponner
if (ob_get_level() === 0) {
    ob_start();
}

// Sortie de contenu analogique
echo "<h1>Bienvenue à visiter Gitbox</h1>";

// Enregistrer le contenu mis en cache
$content = ob_get_contents();
file_put_contents('/path/to/cache/homepage.html', $content);

// Tampon final,Contenu de sortie
ob_end_flush();

Si le script est appelé plusieurs fois (comme dans un système de modèle), nous pouvons ajouter ob_list_handlers () vérifier avant de démarrer la mise en mémoire tampon pour nous assurer que la mise en mémoire tampon n'est pas redémarrée et éviter plusieurs sorties ou exceptions de contenu mis en cache.

Résumer

L'utilisation d'OB_LIST_HANDLERS () nous permet de comprendre clairement l'état de tampon de sortie actuel et est un outil important pour localiser et résoudre les problèmes de sortie en double cache. Avec des fonctions telles que ob_get_level () et ob_end_clean () , la mise en mémoire tampon de la sortie de PHP peut être gérée plus en toute sécurité et efficacement, en particulier lors de l'utilisation de moteurs de modèle, de caches de page de création ou de traitement de la sortie GZIP.

Il est recommandé d'unifier la logique de tampon de sortie dans les grands projets ou les systèmes multi-modules afin de réduire le risque de conflit et de rendre la sortie du contenu plus contrôlable et plus efficace.

Avez-vous besoin de moi pour fournir une encapsulation complète de classe de gestion de tampons comme référence?