Maison  >  Article  >  développement back-end  >  Comment vider le tampon en php ?

Comment vider le tampon en php ?

青灯夜游
青灯夜游original
2020-08-25 11:54:065073parcourir

Comment vider le tampon en PHP : 1. Utilisez la fonction "ob_clean()" pour effacer le contenu du tampon PHP ; 2. Utilisez la fonction "ob_end_clean()" pour vider le tampon PHP. contenu du tampon et fermez le tampon de sortie.

Comment vider le tampon en php ?

Recommandé : "Tutoriel vidéo PHP"

Comment vider le tampon en php

Méthode 1 : ob_end_clean

ob_end_clean — Effacer (effacer) le tampon et fermer le tampon de sortie

Syntaxe :

ob_end_clean ( void ) : bool

Cette fonction supprime le contenu du tampon de sortie le plus haut et ferme ce tampon. Si vous souhaitez poursuivre le traitement du contenu du tampon, vous devez appeler ob_get_contents() avant ob_end_clean(), car le contenu du tampon sera supprimé lors de l'appel de ob_end_clean().

Valeur de retour

Renvoie VRAI en cas de succès, ou FAUX en cas d'échec. La raison de l'erreur est tout d'abord qu'il n'y a pas de tampon actif au moment de l'appel, ou que le tampon ne peut pas être supprimé pour une raison quelconque (peut-être pour un tampon spécial).

Méthode 2 : Utiliser ob_clean()

ob_clean — effacer (effacer) le tampon de sortie

Instructions

ob_clean ( void ) : void

Cette fonction utilisé pour supprimer le contenu du tampon de sortie.

Cette fonction ne détruit pas le tampon de sortie comme la fonction ob_end_clean().

La mise en mémoire tampon de sortie doit avoir été démarrée par ob_start() avec l'indicateur PHP_OUTPUT_HANDLER_CLEANABLE. Sinon, ob_clean() n'aura aucun effet.

Valeur de retour

Aucune valeur de retour.

Développer les connaissances

Qu'est-ce qu'un tampon ?

En termes simples, la fonction de le tampon consiste à mettre d'abord le contenu d'entrée ou de sortie dans la mémoire sans l'afficher ni le lire. Quant à savoir pourquoi il y a un tampon, c'est une question très large. Si vous êtes intéressé, vous pouvez trouver des informations sur Internet

En fait, le rôle le plus essentiel du tampon est de coordonner le fonctionnement du processeur à haute vitesse et des périphériques IO relativement lents (disques, etc.

Où PHP est-il utile lorsque). exécuter ? Au tampon ?

Si vous voulez comprendre le tampon de PHP, vous devez savoir où le tampon est défini lors de l'exécution de PHP

Lors de l'exécution de PHP, si Quand. rencontrant du code qui génère des données telles que echo print_r, PHP placera les données à afficher dans le propre tampon de PHP et attendra la sortie

Lorsque le propre tampon de PHP reçoit une instruction, il lui est demandé de sortir lors de la lecture du contenu. du tampon, les données du tampon seront sorties vers Apache. Apache reçoit les données sorties par PHP, puis stocke les données dans le propre tampon d'Apache et attend que

soit sorti lorsqu'Apache reçoit l'instruction. et veut uniquement afficher le contenu du tampon, il affichera le contenu du tampon et le renverra au navigateur

Étapes : Exécuter php---->(encounter echo, print_r Like output) placez les données de sortie dans le propre tampon de PHP et attendez la sortie ----> (recevoir le contenu du tampon de sortie), les données sont sorties vers Apache et stockées dans le propre tampon d'Apache ----> Afficher le contenu du tampon et le renvoyer au navigateur

echo、print => php output_buffering => webServer buffer => browser buff => browser display

C'est-à-dire : sortie du script => paramètres du tampon php => paramètres du tampon système (apache, nginx) => Parcourir Le paramètre de tampon du serveur => Affiché à l'utilisateur

On peut voir que lorsque PHP veut sortir des données, il passera par deux tampons (d'abord le sien, puis celui d'Apache), puis reviendra au navigateur

Quel rôle le tampon joue-t-il en PHP ?

1. La chose la plus courante est que certaines données ont été générées avant d'utiliser la fonction d'en-tête. Cela provoquera certaines erreurs, telles que Impossible de modifier les informations d'en-tête -. en-têtes déjà envoyés par ;

echo "this is test";
header("LOCATION http://www.baidu.com");

La raison de cette erreur est que certaines données ont été générées avant l'en-tête, et lors de la sortie de ces données, apache Un statut de réponse sera envoyé au navigateur en même temps (puisque il y a une sortie, la requête est valide), puis vous utilisez à nouveau la fonction d'en-tête

pour envoyer l'en-tête http, cette erreur sera renvoyée Erreur Cela signifie : l'en-tête HTTP a été envoyé, vous ne pouvez pas le modifier.

Pourquoi l'utilisation d'un tampon peut-elle éviter cette erreur ?

Parce que la fonction d'en-tête n'est pas affectée par le tampon Oui, lorsqu'il rencontre la fonction d'en-tête, PHP exécute immédiatement Apache pour envoyer cet en-tête http. au navigateur.

Et les données de sortie seront stockées dans le tampon après que PHP ait ouvert le tampon de sortie. De cette façon, vous pouvez éviter les erreurs qui se sont produites auparavant. >2. Lors de l'écriture d'un programme de téléchargement de fichiers via PHP. ((Exemple) Le principe de la méthode PHP d'implémentation du transfert de reprise de point d'arrêt HTTP)

Afin de rendre le téléchargement de fichiers plus sûr et d'améliorer plus de contrôlabilité, de nombreux amis aiment le faire. utiliser PHP pour écrire des pages de téléchargement de fichiers. Le principe est très simple, c'est de lire et d'afficher le contenu du fichier via fwrite, puis d'utiliser l'en-tête Pour envoyer un en-tête HTTP pour faire savoir au navigateur qu'il s'agit d'une pièce jointe, afin que le l'effet de téléchargement peut être obtenu

.

如果用上面的办法提供下载页面,会碰到一个效率问题,如果一个文件很大,假设为100M,那么在不开启缓冲区输出的情况下,必须要把100M数据全部读出,然后一次返回到页面上,如果这样做,用户将会在所有数据读完之后才会得到响应,降低了用户体验感.

如果开启了输出缓冲区,当PHP程序读完文件的某一段,然后马上输出到apache,然后让apache马上返回到浏览器,这样就可以减少用户等待时间.那后面的数据怎么办呢?我们可以写一个while循环,一直一段一段地读取文件每读一段,就马上输出,直到把文件全部输出为止,这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕. 另外,该做法还解决了另外一个很严重的问题.例如一个文件是100M,如果不开启缓冲区的情况下,则需要把100M文件全部读入内存,然后再输出.但是,如果PHP程序做了内存限制呢?为了保证服务器的稳定,管理员通常会把PHP的执行

内存设一个限制(通过php.ini总的memory_limit, 其默认值是8M), 也就是每个PHP程序使用的内存不能使用超过这个值的内存. 假设该值为8M,而要读入的文件是100M,根本就没有足够的内存来读入该文件.这个时候,我们就需要用到上面的

办法来解决这个问题,每次只读某一段,这样就可以避免了内存的限制

3、静态文件缓存

现在很多公司有这么一个需求, 就是某一个页面在第一次访问的时候,会执行PHP,然后把显示的内容返回到浏览器,同时需要把这次显示的内容保存到服务器上,这样下次访问的时候,就直接把保存在服务器上的文件直接显示,而不需要通过PHP来做操作这就是所谓的”静态页面缓存”.那怎么样才能做到把内容返回到浏览器的同时把数据保存到服务器上呢?这就要用到输出缓冲区了.

ob_start();
echo 'aaa';
$string = ob_get_contents();
file_put_contents('a.html', $string);
ob_flush();
flush();

与输出缓冲区有关的配置

在PHP.INI中,有两个跟缓冲区紧密相关的配置项

1.output_buffering

该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值);

  • on    - 开启缓冲区

  • off    - 关闭缓冲区

256k    - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区(把数据发送到apache);

2.implicit_flush

该配置直接影响apache的缓冲区,有2种配置参数. on/off

  • on - 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等待其他指令,直接就把输出返回到浏览器

  • off - 不自动刷新apache缓冲区,接受到数据后,等待刷新指令

与缓冲区有关的函数

1.ob_implicit_flush

作用和implicit_flush一样,是否自动刷新apache的缓冲区

2.flush

作用是发送指令到apache,让apache刷新自身的输出缓冲区.

3.ob_start

打开输出缓冲区,无论php.ini的文件如何配置,如果使用该函数,即使output_buffering设置成off,也会打开输出缓冲区

ob_start函数还接受一个参数,该参数是一个函数的回调,意思是,在输入缓冲区内容之前,需要使用调用传递进来的参数把缓冲区的内容处理一次,再放入缓冲区内

4.ob_flush

指示php本身刷新自身的缓冲区,把数据发送到apache

5.ob_clean

清除php缓冲区里面的内容

6.ob_end_clean

清除php缓冲区内的内容,并且关闭输出缓冲区

7.ob_end_flush

把php自身的缓冲区里的内容发送到apache,并把清除自身缓冲区内的内容

8.ob_get_clean

获取缓冲区的内容之后,清除缓冲区.

9.ob_get_contents

获取输出缓冲区里的内容

10.ob_get_flush

获取缓冲区里的内容,并且把这些内容发送到apache

11.ob_get_length

获取缓冲区里内容的长度

12.ob_list_handlers

获取运行ob_start时,所回调的函数名称, 例如:

ob_start(‘ob_gzhandler’);

print_r(ob_list_handlers);

将打印出ob_gzhandler;

13.ob_gzhandler

该函数的作用是作为ob_start的回调参数, 在缓冲区刷新之前,会调用该函数对数据进行到底gzip或者deflate压缩.这个函数需要zlib扩展的支持.

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