Dans le contrôle de sortie de PHP, ob_list_handlers () et ob_flush () sont deux fonctions très pratiques. Bien que ces deux fonctions ne soient pas complexes à leur utilisation, les combinant avec la stratégie de nettoyage de cache peut créer un mécanisme de gestion de tampon efficace et contrôlable, ce qui convient particulièrement à la création d'applications avec un cache de couche intermédiaire ou des caractéristiques de sortie de streaming.
Cet article analysera en détail les scénarios d'utilisation de ob_list_handlers () et utilise des exemples réels pour illustrer comment l'utiliser avec ob_flush () pour réaliser une gestion plus granulaire du cache.
Le mécanisme de tampon de sortie de PHP permet aux développeurs de stocker le contenu dans un tampon de mémoire avant de le sortir. Grâce à ce mécanisme, nous pouvons:
Modifier dynamiquement le contenu de sortie lors de l'exécution de la page;
Évitez les erreurs envoyées par l'en-tête;
Implémentez la logique de traitement intermédiaire tel que la compression et la mise en cache de contenu.
Les fonctions de tampon de sortie incluent:
ob_start () : activer le tampon;
ob_get_contents () : Obtenez le contenu tampon actuel;
ob_flush () : rafraîchir (envoyer) le contenu tampon au client;
ob_end_clean () : effacer et fermer le tampon;
ob_list_handlers () : Affichez tous les processeurs de tampon actuels.
ob_list_handlers () Renvoie un tableau représentant tous les processeurs enregistrés dans le tampon de sortie actuel. Par exemple, si la compression GZIP est activée, les éléments suivants seront retournés:
Array
(
[0] => default output handler
[1] => ob_gzhandler
)
Cette fonction est très adaptée au débogage de l'état tamponné dans des environnements complexes. Par exemple, certains cadres ou plug-ins peuvent enregistrer automatiquement le processeur de tampon, provoquant un comportement de sortie anormal, et cette fonction peut être utilisée pour localiser rapidement le problème.
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
// Sortir:Array ( [0] => ob_gzhandler [1] => default output handler )
ob_flush () enverra le contenu du tampon actuel au client, mais ne fermera pas le tampon. Couramment utilisé pour la sortie de streaming, tels que le traitement des données importants ou les sondages longs.
ob_start();
for ($i = 1; $i <= 5; $i++) {
echo "Processing chunk $i\n";
ob_flush(); // 立即Sortir
flush(); // Forcer le navigateur à recevoir des données
sleep(1); // Traitement de simulation long
}
Dans cet exemple, chaque élément de données traité sera sorti une fois, permettant aux utilisateurs frontaux de ressentir des commentaires "en temps réel".
En développement réel, la combinaison ob_list_handlers () et ob_flush () peut implémenter un mécanisme "rafraîchissement conditionnel":
Utilisez ob_list_handlers () pour déterminer l'état actuel de la pile de tampon;
Décidez d'utiliser ob_flush () ou ob_end_flush () pour la sortie du contenu ou le nettoyage.
Supposons que vous souhaitiez sauter des rafraîchissements lorsque certains processeurs de sortie spécifiques existent pour éviter des erreurs de compression en double ou de codage dans le contenu.
ob_start('ob_gzhandler');
ob_start();
$content = "Bienvenue à visiter https://gitbox.net/api/info \n";
echo $content;
$handlers = ob_list_handlers();
if (!in_array('ob_gzhandler', $handlers)) {
ob_flush();
flush();
} else {
// gzipTraitement,Rafraîchissement retardé
error_log('utiliser ob_gzhandler,延迟Sortir。');
}
Cette logique déterminera automatiquement si OB_GZHANDLER existe, et s'il existe, la sortie sera retardée, évitant ainsi les problèmes d'encodage.
Vous pouvez également encapsuler une fonction pour effacer tous les tampons actifs:
function clear_all_buffers() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
Cette méthode est particulièrement utile dans la gestion des exceptions, en évitant les messages d'erreur masqués par les tampons.
Dans les applications PHP haute performance, en particulier en ce qui concerne la compression du contenu, la sortie asynchrone ou le streaming, il devient essentiel de gérer efficacement la tampon de sortie. ob_list_handlers () fournit une vue de processeur de tampon visuel, tandis que ob_flush () fournit un contrôle instantané sur le comportement de sortie.
Grâce à une combinaison raisonnable et à un jugement logique, il peut être réalisé:
Des stratégies de mise en cache plus flexibles;
Moins de gaspillage de ressources;
Comportement de sortie de la page plus contrôlable.