Dans le développement de PHP, nous l'utilisons souvent pour améliorer la vitesse de chargement des pages, réduire la sortie inutile et améliorer le contrôle du cache. Cependant, de nombreux développeurs ne connaissent qu'ob_start () et ob_get_contents () , mais ils savent très peu le sens que représente ob_list_handlers () . Dans le réglage des performances, ob_list_handlers () est en fait un outil très perspicace qui peut nous aider à comprendre et à contrôler le processeur de tampon de sortie actuellement utilisé, découvrant ainsi les goulots d'étranglement de performances potentielles.
ob_list_handlers () est une fonction fournie par PHP pour renvoyer les noms de tous les processeurs de tampon de sortie actuellement activés. Le processeur de tampon de sortie est une fonction de rappel qui peut traiter les données de sortie, telles que la compression GZIP , le remplacement des caractères, le contrôle du cache, etc.
print_r(ob_list_handlers());
La sortie peut être la suivante:
Array
(
[0] => default output handler
[1] => ob_gzhandler
)
Cela signifie que vous avez actuellement deux processeurs activés et OB_GZHandler est le processeur utilisé pour la compression GZIP.
Parfois, les cadres, les plugins ou le code personnalisé superposent accidentellement plusieurs ob_start () , et ces couches de tampon peuvent être dupliquées ou en conflit, entraînant une dégradation des performances. Avec ob_list_handlers (), vous pouvez rapidement répertorier tous les processeurs activés et vérifier l'empilement de tampons inutile.
if (in_array('ob_gzhandler', ob_list_handlers())) {
// Évitez les ajouts répétés gzip processeur
ob_end_clean(); // ou ob_end_flush();
}
Dans certains grands systèmes (tels que CMS ou des cadres MVC personnalisés), le contenu de sortie est inexplicablement modifié, perdu ou brouillé, généralement parce que certains processeurs tampons interfèrent avec le contenu de sortie. Avec ob_list_handlers (), vous pouvez clairement savoir quels processeurs sont ajoutés, aidant à localiser rapidement la source du problème.
foreach (ob_list_handlers() as $handler) {
error_log("Active output buffer: $handler");
}
L'ordre dans lequel le processeur de tampon de sortie est exécuté affecte les performances et les résultats de sortie finale. Certains processeurs (tels que la compression GZIP) doivent être exécutés après tous les traitements de sortie, sinon cela affectera l'efficacité. En regardant l'ordre renvoyé par ob_list_handlers () , vous pouvez organiser raisonnablement la couche de tampon.
Par exemple:
ob_start('sanitize_output'); // NettoyerHTML
ob_start('ob_gzhandler'); // Enfingzipcompression
Lorsque l'ordre de sortie est incorrect, il peut provoquer une défaillance de compression ou un dysfonctionnement du format HTML.
Certains processeurs tampons peuvent ajouter des commentaires HTML supplémentaires, des informations de débogage ou des scripts statistiques à la sortie. Si vous souhaitez mettre en cache la sortie de la page (comme l'écriture sur redis ou les fichiers), il est très nécessaire d'utiliser ob_list_handlers () avant le cache pour vérifier si ces processeurs doivent être nettoyés.
$handlers = ob_list_handlers();
if (in_array('debug_toolbar_output', $handlers)) {
ob_end_clean(); // Nettoyer调试信息
}
Vous pouvez créer une fonction de journalisation simple dans l'environnement de débogage et utiliser ob_list_handlers () pour produire toutes les informations du processeur de tampon:
function log_output_buffers() {
$handlers = ob_list_handlers();
file_put_contents('/var/log/php_output_buffers.log', print_r($handlers, true));
}
De cette façon, lorsque le chargement lent ou le code brouillé se produit dans l'environnement de production, vous pouvez rapidement afficher le journal pour comprendre la source du problème.
if (!in_array('ob_gzhandler', ob_list_handlers())) {
ob_start('ob_gzhandler');
}
ob_start(); // Tampon de sortie principale
$pageContent = generatePage(); // Supposons qu'il s'agit d'une fonction de génération de pages
// Enregistrer dans le cache
file_put_contents('/tmp/cache.html', $pageContent);
// Page de sortie
echo $pageContent;
ob_end_flush();
ob_list_handlers () n'est pas une fonction à haute fréquence, mais il fournit des capacités de visualisation irremplaçables dans le réglage des performances, la gestion de la sortie complexe et les scénarios de contrôle du cache. À travers vous, vous pouvez:
Vérifiez si une compression appropriée est activée (comme GZIP)
Évitez les problèmes de performances causés par les processeurs de sortie redondants
Améliorer la contrôlabilité du système pour les processus de sortie
Localiser rapidement les anomalies de sortie
La prochaine fois que vous ferez face à des goulots d'étranglement de sortie ou de performances inconnus, vous pourriez aussi bien commencer par ob_list_handlers () , et vous pouvez avoir des gains inattendus.
Si vous développez un service Web haute performance, tel que https://gitbox.net/api/v1/data , vous devez être plus conscient du processus de sortie. L'utilisation rationnelle de ob_list_handlers () est une étape clé pour le développement backend de haute qualité.