Home>Article>Backend Development> Analysis of basic concepts and principles of output buffer based on PHP
1. Concept
During the running of PHP, the function or operation result that generates output can be temporarily saved in the PHP buffer. Area, only when the buffer is full, or PHP has finished running, or output is performed when necessary, the data will be output to the browser. This area of buffered data is called PHP's output buffer (OB).
2. Principle
①After using the buffer, when executing PHP, if you encounter codes such as echo and print_r that will output data (actual Many functions will generate output), PHP will put the data to be output into PHP's own buffer and wait for output;
②When PHP's own buffer receives an instruction, indicating that the contents of the buffer should be output When, the data in the buffer will be output to the server. The server receives the data output by PHP, and then stores the data in the server's own buffer, waiting for output;
③When the server accepts When you reach the instruction, just when you want to output the contents of the buffer, the contents of the buffer will be output and returned to the browser.
As can be seen above, the output buffer layer is not the only layer used to buffer output, it is actually just one of many layers. The last thing you need to remember is that the behavior of the output buffer layer is related to the SAPI you are using (web or cli). Different SAPIs may have different behaviors.
As mentioned in the first concept, the buffered data will be output when the buffer is full. This is related to SAPI. The buffer is mainly controlled through the output_buffering variable in php.ini. The default of output_buffering is on, and the default value is 4096 (4kb).
3. Output buffer configuration
1. Taking the SAPI of PHP-FPM that we usually use as an example, here is a summary of the PHP ini file configuration: There are mainly three options:
output_buffering
implicit_flush
output_handler
Use a table to clarify the meaning of these three parameters:
#Note that the above three values cannot be changed using ini_set() at runtime. value.
2. Regarding the configuration when executing in PHP CLI mode, it is different from FPM. There are a few points to note:
(1) The output_buffering parameter is not enabled by default,
(2) The implicit_flush parameter is set to 1 (on) by default.
3. Regarding the output_handler setting callback function, you can refer to several common settings:
①ob_gzhandler: use ext/zlib to compress the output;
②mb_output_handler: use ext/mbstring conversion Character encoding;
③ob_iconv_handler: Use ext/iconv to convert character encoding;
④ob_tidyhandler: Use ext/tidy to organize the output HTML text;
⑤ob_[inflate/deflate]_handler : Use ext/http to compress output;
⑥ob_etaghandler: Use ext/http to automatically generate HTTP Etag;
4. Output buffer related methods
ob_start(); //Open an output buffer. All output information is no longer sent directly to the next layer, but is saved in the output buffer.
ob_clean(); //Delete the contents of the internal buffer without closing the buffer (no output).
ob_end_clean(); //Delete the contents of the internal buffer and close the buffer (no output).
ob_get_clean(); //Return the contents of the internal buffer and close the buffer.
ob_flush(); //Send the buffer content to the next layer, delete the buffer content, and do not close the buffer.
ob_end_flush(); //Send the buffer content to the next layer, delete the buffer content, and close the buffer.
ob_get_flush(); //Return the contents of the buffer, close the buffer, and then release the contents of the buffer.
ob_get_contents(); //Return the contents of the buffer without output.
ob_get_length(); //Returns the length of the buffer. If the buffer is not activated, returns FALSE.
ob_get_status() ; //Get the status of all output buffers.
ob_implicit_flush(); //Turn on/off absolute flushing.
5. Application of output buffer
1. Open before session, cookie, header and other setting functions:
The most common one is Before using the header function, some data has been output, which will lead to certain errors, such as Cannot modify header information – headers already sent by;
The reason for this error is that it has been output before the header. Certain data, and while outputting this data, the server will also send a response status to the browser (since there is output, the request is valid), and then you use the header function again
Send the http header, and this error will be returned. The error means: the HTTP header has been sent, and you cannot modify it.
So you can enable the ob_start method at the beginning.
2. Control the download function of PHP program:
Usually many people use PHP to download files. However, when the size of a file is too large (such as 100M), if it is read into the memory first and then transferred to user, the response time will be greatly lengthened (or even timeout), and the memory usage will also be greatly increased (or even overflow).
Using output buffering, you can read the read file into the buffer, transfer it to the user when it reaches a certain size, and then continue reading to achieve the effect of sharding. In this way, the browser can continue to receive data without having to wait until all files are read, and the memory will not take up too much.
3. Cache as static files:
Files that need to be read multiple times and have a very low frequency of modification will be placed in the buffer when read for the first time to generate static files. , each subsequent read can be returned directly without going through PHP processing (reading the database, etc.).
For more PHP related technical articles, please visit thePHP Tutorialcolumn to learn!
The above is the detailed content of Analysis of basic concepts and principles of output buffer based on PHP. For more information, please follow other related articles on the PHP Chinese website!