The charm of php output cache
1: Introduction to output cache
The so-called output cache in php is that the echo or other output commands in the code are first written to the php buffer when executing, and after the script is executed or forced The data will be output to the browser only after the output cache command is executed (php buffer is the output_buffering set in php.ini, the default is on, indicating unlimited size, and can be changed to a number to limit the size).
Example:
echo 'hlmblog.com';
echo 'Technology';
echo 'Sharing';
These two echoes are inserted into the buffer in order, only when the script execution is completed or the output is forced to be cached Only then will the data be output to the browser.
If I want to output echo data in real time, see the code below:
I want to output echo data in real time, see the code below:
ob_end_flush(); //Close php cache, or flush () execute ob_flush() first, as explained below
echo str_pad(" ", 256);
for ($i=5; $i>0; $i--) {
echo $i. '
When php.ini does not enable the php buffer cache, the content output by the php script will be in a state of waiting for output on the server and will not be saved to the output cache because the cache is not turned on. At this time, flush can be used to flush the content waiting for output. Immediately output to the client (browser or other output terminal).
When php.ini turns on the php buffer cache, the first step of the php script output content is to store it in the output cache. At this time, there is no data in the output content. Using flush has no effect and the data cannot be obtained. . Therefore, we must first use ob_flush to take out the content from the output cache and put it in a state waiting for output, and then use flush to send the content to the client. The order of execution is ob_flush first and then flush.
So to achieve real-time output, either use ob_end_flush to turn off the php output cache and then flush directly, or ob_flush first and then flush.
2: The browser cannot output real-time data
Change the code to the following code. In Chrome, Firefox, IE and other browsers, it is output all at once. It is a very strange phenomenon:
ob_end_flush(); //Close php cache, or Before flush ob_flush();
echo str_pad(" ", 256);
for ($i=5; $i>0; $i--) {
echo $i;
flush();
sleep(1 );
}
After looking for bugs for a long time, I finally discovered a phenomenon. Just add an html tag by the way and you can output it in real time.
The reason is: it will be output immediately only when it encounters an html tag. It is really magical. Fortunately, the output content will generally have html tags and rarely plain text.
Solution: Add a carriage return or other html tag to solve the problem.
Two: What can be used to control the cache output, a few specific examples
1: Generate static pages
The loading speed of static pages is fast, this sentence is a well-known truth, there is no need to request the database, this is how What a cool thing.
The following is an example of generating a static page:
echo str_pad('', 1024);//Overflow the buffer
ob_start();//Open the buffer
$content = ob_get_contents();//Get the page output Content
$f = fopen('./index.html', 'w');
fwrite($f, $content);//The content is written into the txt file
fclose($f);
ob_end_clean();/ /Clear and close the buffer
The legendary static page is simply generated like this.
2: Capture the output
function test($param) {
if($param) {
ob_start();
eval($param);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo 'Unfortunately no output';
exit();
}
return $contents;
}