Home >Backend Development >PHP Tutorial >Detailed explanation of output_buffering example based on php output cache

Detailed explanation of output_buffering example based on php output cache

伊谢尔伦
伊谢尔伦Original
2017-06-24 13:35:191417browse

First clarify the output order of PHP

1. Turn on the php output cache: echo,print -> php output_buffring -> server buffering - > browser buffering -> browser display
2. PHP output cache is not turned on: echo,print -> server buffering -> browser buffering -> browser display
Also clarify the browser's output cache: IE is 256Bytes, Chrome and FireFox are 1000Bytes. Only when the output data reaches this length or the script ends will the browser output the data on the page

Let’s talk about several PHP settings and APIs used:
1.output_buffering configuration in php.ini
•Off: means turning off the PHP output cache
•On: turning on infinite Output cache
•4096: Open the output cache with a size of 4096Byte

Implicit_flush configuration in 2.php.ini
•On: Indicates each output (such as echo, After printing), the flush() function is automatically called, and
•Off is directly output: Contrary to On, flush() will not be called after each output, and it will not be output until the server buffering is full, but we can use flush() ) function instead of it, it doesn’t matter if it is not enabled, but it is more flexible

3.ob_flush() function: Take out the data in PHP buffering and put it into server buffering

4.flush() function: Take out the data from Server buffering and put it into browser buffering

##5.ob_start() function: I don’t know much about this function now, because after it is turned on, the output will not be controlled by ob_flush(). Even if ob_flush() and flush() are used, the data cannot be output immediately on the browser. What I know now is that if output_buffering=Off, even if ob_start() is used, the output data cannot be cached. If output_buffering=On, even if ob_start() is not used, the output data can be cached by PHP, so I think ob_start is relatively useless, so I will ignore it for the time being
Then let’s look at the code (set output_buffering=4096, implicit_flush=Off)

<html>
     <body>
         <?php
             // ob_start();    //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
             // echo str_repeat(&#39; &#39; ,1000);    //IE缓存256Bytes
             echo str_repeat(&#39; &#39; ,1000);    //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
             for($i=0;$i<5;$i++) {
                 echo $i.&#39;<br />&#39;;
                 ob_flush();
                 flush();
                 sleep(1);
             }
         ?>
     </body>
 </html>

The output of the code here is output line by line. Please refer to ob_flush for the specific principle. () and flush() function
If either of these two functions is missing, under my setting, I have to wait until 0, 1, 2, 3, 4 are cached and finally output together
Finally
QuoteA paragraph from Laruence's blog, I hope it will be helpful to everyone's understanding

ob_flush/flush's description in the manual is to refresh the output buffer, and it also needs to be used in conjunction, so it will This has caused confusion to many people...

In fact, they operate on different objects. In some cases, flush does not do anything at all.

ob_* series of functions operate the output buffer of PHP itself. Area.

So, ob_flush is to refresh PHP's own buffer.

And flush, strictly speaking, this is only available when PHP is used as apache's

Module(handler or filter) is installed, it has an actual effect. It refreshes the buffer of the WebServer (which can be considered to refer specifically to apache).

Under the sapi of the apache module, flush will call the flush member of sapi_module

Function pointer, indirectly calls Apache's API: ap_rflush refreshes Apache's output buffer. Of course, the manual also says that there are some other modules of Apache that may change the result of this action..1.Some Apache modules, such as mod_gzip, may perform output caching themselves,
2. This will cause the results generated by the flush() function to not be sent to the client browser immediately.
3.
4. Even the browser will cache the received content before displaying it. For example, Netscape
5.The browser will cache the content until it receives a newline or the beginning of the html tag, and it will not display the entire table until
6.it accepts the f16b1740fad44fb09bfe928bcc527e08 tag.
7.
8. Some versions of Microsoft Internet Explorer will only start displaying the page after receiving 256
9. bytes, so some extra spaces must be sent to allow this
10. Some browsers display page content.
So, the correct order to use the two is. First ob_flush, then flush,
Of course, under other sapi, you can not call flush, but to ensure the portability of your code, it is recommended Supporting the use of.

The above is the detailed content of Detailed explanation of output_buffering example based on php output cache. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn