Maison  >  Article  >  développement back-end  >  Explication détaillée des exemples d'extension de fonction ob en php

Explication détaillée des exemples d'extension de fonction ob en php

伊谢尔伦
伊谢尔伦original
2017-06-24 14:35:201515parcourir

Pour un nouveau programmeur PHP, le tampon PHP est presque transparent. Dans leur esprit, avec une fonction echo print_r , les données voleront vers le navigateur avec un son « swoosh » et seront affichées. J'ai toujours pensé si simplement. En fait, dans le monde de la technologie, les choses ont toujours progressé de la simplicité à la complexité. Peut-être que ces développeurs de technologies ont commencé aussi simplement que vous et moi, mais face à la cruelle réalité, ils ont dû ajuster leurs stratégies afin de s'améliorer. l'efficacité opérationnelle de la machine. Enfin, ils ont pensé à ces éléments qui rendent la machine plus efficace. Une idée que nous admirons.

En parlant de tampon, c'est-à-dire de tampon, nous devons le comparer avec le cache. La simple comparaison des définitions n'a aucun sens. Pourquoi ne pas regarder ce qu'elles font. La mise en cache résout le problème de la recherche et de l'utilisation rapides des données et économise la consommation du processeur, tandis que la mise en mémoire tampon résout le problème de l'inadéquation entre le processeur à haute vitesse et les périphériques d'E/S à faible vitesse.

Parlons de l'autre protagoniste de cet article, la fonction ob ob est l'abréviation de output_buffering. Puisque la fonction ob est une fonction d'extension PHP, l'opération principale de la fonction ob est tampon php.

Après avoir brièvement évoqué les deux protagonistes de cet article, il faut revenir au sujet de départ. Comment les données sorties par la fonction echo print_r parviennent-elles au navigateur pour que l'utilisateur les voie ? Le processus réel est le suivant :

echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display

Nous pouvons clairement voir que depuis la fonction echo, print_r jusqu'à l'envoi d'informations au client, cela passe également par deux tampons. via un tampon de navigateur. Ce dont nous discutons principalement dans cet article est php output_buffering.

Utilisation du tampon lorsque la fonction ob n'est pas utilisée

Nos codes n'utilisent souvent pas du tout la fonction ob, alors utilisent-ils le tampon ? Cela dépend des paramètres php. Le tampon est contrôlé via la variable output_buffering dans php.ini. Sa valeur par défaut est off et peut être activée pour ouvrir le tampon. Après avoir appelé le tampon, même si la fonction ob n'est pas utilisée dans le programme, le code utilise réellement le tampon. De plus, quel que soit le réglage de output_buffering dans php.ini, php en mode cli est toujours fermé par défaut.

Pourquoi c'est un tampon ? Pour faire simple, le processeur haute vitesse a traité ses propres données plus tôt et souhaite les transmettre à l'utilisateur via la ligne, mais la ligne est trop étroite et ne peut pas être transmise en même temps. Si un tampon est introduit, le processeur peut rapidement placer les données générées dans le tampon, puis les reposer dans un endroit frais. Le tampon produit les données en temps opportun selon les instructions. Cela résout efficacement la contradiction entre les processeurs à haute vitesse et les périphériques d'E/S à faible vitesse.

Quand les données du tampon seront-elles sorties ? 1. Lorsque le tampon est plein, le tampon a une capacité et le contenu sera automatiquement affiché lorsque la limite est atteinte. 2. L'exécution du script est terminée. De nombreux petits programmes ne génèrent pas beaucoup de contenu, vous ne pouvez donc pas attendre que le tampon soit plein avant de produire ~ C'est naturel.

 Utilisation du tampon lors de l'utilisation de la fonction ob

ob_start()

Activer la mise en mémoire tampon de sortie. Cette fonction est l’une des fonctions que nous appelons le plus. Avec output_buffering défini sur on ou x k, cette fonction n'ouvre pas tant le tampon de sortie qu'elle étend le tampon de sortie à une grande taille. Bien entendu, à condition que output_buffering soit désactivé, ob_start jouera le rôle d'ouverture du tampon. ob_start() peut également transmettre un paramètre facultatif à la fonction output_callback, qui est expliqué en détail dans le manuel officiel de PHP.

ob_get_contents()

Récupère simplement le contenu du tampon de sortie mais ne l'efface pas.

ob_end_clean()与ob_clean()

La différence entre ces deux fonctions peut être vue littéralement. Le premier efface le contenu du tampon et le ferme, tandis que le second effectue uniquement le travail de nettoyage. Il convient de noter qu'après avoir utilisé ces deux fonctions, les fonctions précédentes telles que echo et print_r ne généreront pas le contenu.

L'auteur a essayé une fois d'imprimer le contenu de ob_get_contents() via print_r, puis a appelé ob_clean() pour vider le tampon, afin de ne pas affecter les opérations ultérieures sur le tampon ont échoué à plusieurs reprises. Si vous y réfléchissez bien, le contenu de print_r est à nouveau écrit dans le tampon, puis l'opération ob_clean() est effectuée, donc naturellement il n'y aura aucune sortie. L'appel de la fonction ob_flush() avant l'opération ob_clean peut obtenir l'effet souhaité.

ob_flush()与flush()

ob_flush() envoie le contenu du tampon et supprime le contenu. Par conséquent, il est préférable d'utiliser ob_get_contents() pour obtenir le contenu du tampon avant cette fonction. flush() vide le tampon côté serveur et l'envoie au client. Par conséquent, du point de vue du processus, ob_flush() doit être appelé en premier, puis la fonction flush.

  另外说明下再Apache buffer flush()的工作原理:在apache module的sapi下,flush会通过调用sapi_module()的flush成员函数指针,间接使用apache的api::ap_rflush刷新apache的输出缓冲区。当然apache其他模块比如mod_gzip可能改变这个动作的结果,可能自己进行输出缓冲区,这将导致flush()函数产生的结果不会立即被送到客户端浏览器。

ob_get_clean()

  如果你已经熟练掌握ob_get_contents()ob_clean(),那这个函数就很简单了。因为它是前两者的结合体。它主要是得到当前缓冲区的内容并删除当前输出缓冲区。

  ob函数还有很多,但大部分用法比较简单,理解较为容易。大家可以参照php手册 ,里面会有详细的解释。本文列出了笔者开始并不是很理解的一些函数,当然今后还会有新的问题出现,想到问题并且解决问题,生活的乐趣也许就在此处吧。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn