Dans la programmation PHP, OB_CLEAN () est une fonction de gestion de tampon de sortie commune. Son objectif est d'effacer le tampon de sortie actuel, mais de ne pas sortir le contenu du tampon. De nombreux développeurs rencontrent le problème du chômage du cache lors de l'utilisation de ob_clean () . Ce phénomène peut confondre les développeurs, pourquoi le contenu tampon existe-t-il encore même après que cette fonction est appelée?
Dans cet article, nous plongerons dans le fonctionnement d'Ob_Clean () , d'analyser les malentendus communs qui peuvent provoquer un chômage du cache et fournir des solutions pratiques.
En PHP, le mécanisme de mémoire tampon de sortie permet aux données de sortie (telles que HTML, texte ou messages d'erreur) d'être stockés temporairement dans un tampon de mémoire plutôt que d'être envoyé directement au navigateur. L'avantage de ce mécanisme est que vous pouvez modifier la sortie pendant l'exécution du script ou contrôler lorsque la sortie est envoyée au navigateur dans certaines conditions.
La fonction ob_clean () est utilisée pour effacer le contenu du tampon actuel. Lorsque cette fonction est appelée, le contenu dans le tampon sera jeté, mais aucune donnée ne sera sortie.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// Démarrer la tampon de sortie</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Effacer le tampon</span></span><span>
</span><span><span class="hljs-comment">// Rien n'est sorti ici,Parce que le tampon est effacé</span></span><span>
</span></span>
Il convient de noter que Ob_clean () ne fera que effacer le tampon de sortie actuellement actif. S'il n'y a pas de tampon actif, ou si aucune donnée n'est tamponnée lorsque l'appel est appelé, il n'aura aucun effet.
Bien que ob_clean () soit clairement défini dans le document, en réalité, les développeurs rencontrent souvent les malentendus suivants, ce qui les amène à croire que le cache n'a pas été effacé:
Si ob_start () n'est pas appelé d'abord pour démarrer le mécanisme de tampon de sortie, appeler ob_clean () n'aura aucun effet. Dans PHP, ob_clean () ne peut effacer le tampon qu'après démarrer le tampon de sortie.
<span><span><span class="hljs-comment">// Démonstration d'erreur:未Démarrer la tampon de sortie</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Il n'y aura aucun effet ici,Parce qu'il n'y a pas de tampon</span></span><span>
</span></span>
La bonne façon de le faire est:
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// Démarrer le tampon</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 这里才会Effacer le tampon</span></span><span>
</span></span>
PHP prend en charge la mise en mémoire tampon de sortie imbriquée. Si la structure de nidification du tampon correct n'est pas traitée lorsque Ob_clean () est appelée, il peut entraîner le fait de clarifier le mauvais tampon, plutôt que le tampon que vous prévoyez d'être effacé. Le tampon de sortie de PHP est basé sur la pile, vous devrez donc peut-être utiliser ob_end_clean () pour terminer et effacer le tampon le plus élevé.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// Démarrer le tampon</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"First output"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 再次Démarrer le tampon</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Second output"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Seul le deuxième tampon sera effacé,N'effacera pas le premier</span></span><span>
</span><span><span class="hljs-comment">// Besoin d'appeler ob_end_clean() Pour effacer le tampon le plus extérieur</span></span><span>
</span></span>
Si le tampon de sortie a été envoyé au navigateur, ob_clean () ne pourra pas effacer le contenu envoyé. PHP enverra automatiquement le contenu tampon au navigateur lorsqu'ils seront prêts et que la sortie est déclenchée. Cela se produit généralement lorsque Flush () est appelé ou que le script se termine automatiquement.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>(); </span><span><span class="hljs-comment">// Contenu du tampon de sortie au navigateur</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Appelé à ce moment ob_clean() Invalide,Parce que le contenu a été envoyé</span></span><span>
</span></span>
La solution consiste à éviter de sortir le contenu du tampon trop tôt ou à terminer le tampon de sortie directement avec ob_end_clean () au lieu de le nettoyer s'il a été sorti.
Si vous fournissez une fonction de rappel pour traiter le contenu tampon dans ob_start () , ce qui est effacé par ob_clean () sera le contenu traité par le rappel. S'il y a des erreurs ou des problèmes logiques dans la fonction de rappel, cela peut vous faire penser que le tampon n'a pas été effacé.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">custom_callback</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$buffer</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$buffer</span></span><span>); </span><span><span class="hljs-comment">// Convertir le contenu tampon en majuscules</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(</span><span><span class="hljs-string">"custom_callback"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// Effacer le tampon,Mais à cause de la fonction de rappel,Le contenu peut avoir été modifié</span></span><span>
</span></span>
Il existe de nombreux autres types de mécanismes de mise en cache dans PHP (tels que OPCACH, Cache de requête de base de données, etc.), qui n'ont rien à voir avec la mise en mémoire tampon de sortie. Par conséquent, ob_clean () ne débarrassera que le tampon de sortie de PHP sans affecter d'autres types de caches.
Pour éviter les malentendus ci-dessus, les développeurs doivent suivre les meilleures pratiques suivantes:
Assurez-vous que le tampon de sortie est démarré correctement : avant d'appeler ob_clean () , assurez-vous d'abord de démarrer le tampon de sortie.
Comprenez la structure de la pile de tampon : si vous utilisez des tampons imbriqués, assurez-vous d'effacer le tampon le plus correct ou d'utiliser ob_end_clean () pour effacer le tampon de niveau supérieur.
Évitez de sortir du contenu à l'avance : ne publiez pas le contenu du tampon avant d'appeler ob_clean () ou ob_end_clean () , et évitez d'appeler flush () .
Vérifiez la fonction de rappel : si vous utilisez une fonction de traitement de tampon de sortie personnalisée, assurez-vous que sa logique est correcte et n'interférera pas avec l'effet d' OB_CLEAN () .
En comprenant ces détails, vous pouvez gérer plus efficacement la mise en mémoire tampon de sortie PHP et éviter les vides de cache et l'invalidation.