This article mainly introduces the detailed introduction of output_buffering in PHP. This article explains some advanced usage of output buffering. Friends who need it can refer to it
I personally think that Output buffering is a relatively pure 4.0 feature. Although conceptually quite simple, output buffering is extremely powerful and makes it easier for developers to develop advanced and efficient programs.
This article will introduce HTTP headers, how output buffering can help you deal with HTTP headers, and introduce some advanced uses of output buffering.
HTTP Header
For each request established using the HTTP protocol, the response generated by the web server usually consists of two parts - headers and body. For example, if there is a small text file called example.txt in the document root directory of the web server, and the file contains the text Hello, world!, then the HTTP request response to this file will look like this:
The code is as follows:
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2000 21:40:08 GMT
Server: Apache/1.3.11 (Unix) mod_macro/1.1.1 PHP/4.0.2-dev
Last-Modified: Sat, 02 Sep 2000 21:39:49 GMT
ETag: "12600b-e-39b173a5"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/plain
Hello, world!
The first part of this request (the larger part) is the HTTP header. Although the HTTP header is not visible to the user in the browser, it contains information for the browser, such as the document content type, the protocol version used, the date the document was last modified, and so on. There are not many rules for HTTP headers. Usually, its format is as follows:
The code is as follows:
Field: Value[Field: value]
They must be separated from the main body of the document by a blank line.
The information of this HTTP header can be added or changed from a PHP script. For example, you can use the header() function:
The code is as follows:
Header("Location: http://www.php.net/"); // Redirect to http://www.php.net/
You can also use the SetCookie() function:
The code is as follows:
SetCookie("foo", "bar");
You may know that HTTP cookies are implemented using HTTP headers. For example, the HTTP request response for the following PHP file
The code is as follows:
SetCookie("foo", "bar");
print "Set cookie.";
?>
It will look like this:
The code is as follows:
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2000 21:43:02 GMT
Server: Apache/1.3.11 (Unix) mod_macro/1.1.1PHP/4.0.2-dev
X-Powered-By: PHP/4.0.2-dev
Set-Cookie: foo=bar
Connection: close
Content-Type: text/html
Set cookie.
The browser reads the HTTP header returned from the server and knows that a cookie called foo (a session cookie in this case) was sent, and its value is bar.
Why use Output Buffering technology
The need for output buffering technology was obvious as early as PHP/FI 2.0. If you have used this version of PHP, you may still remember that you often encountered the error message Oops, SetCookie called after header has been sent, which made you scratch your head and wonder what the reason was.
If you have used the latest version of PHP - PHP 3.0 or even PHP 4.0 - then you will know this error message: Oops, php_set_cookie called after header has been sent. Alternatively, you may encounter the Cannot add header information - headers already sent message when trying to call PHP's header() function. In general, output buffering technology users avoid these annoying error messages, while developers can also use it for advanced purposes.
When do these errors occur? These error messages occur if you try to add or modify header information after the HTTP header has been sent, and if there is a lack of blank lines between the document body and the header. To understand how this happens, let's take a look at how PHP handles HTTP header output and body output.
When the script starts executing, it can send header information and body information at the same time.
Header information (from header() or SetCookie() function) is not sent immediately, instead, it is saved to a list.
This allows you to modify the header information, including the default header (such as the Content-Type header). However, once the script sends any non-header output (for example, using a block or a print() call), then PHP must send all the headers before sending a blank line, terminating the HTTP header, and only continue after that. Send body data. From this point on, any attempt to add or modify header information is not allowed and will send one of the above error messages.
Although this does not cause much of a problem, sometimes it just terminates the HTTP header before sending any input, thus complicating the script logic. Output buffering technology can solve these problems.
How Output Buffering works
When output buffering is enabled, PHP does not send HTTP headers when the script sends output. Instead, it pipes this output into a dynamically growing cache (only available in PHP 4.0, which has a centralized output mechanism). You can still modify, add header rows, or set cookies, since the headers are not actually sent. In the simplest case, when the script terminates, PHP will automatically send the HTTP header to the browser, and then send the contents of the output buffer. It's simple.
Basic usage
You can use the following four functions, which can help you control output buffering:
The code is as follows:
ob_start()
Enable output buffering mechanism.
Output buffering supports multiple levels - for example, the ob_start() function can be called multiple times.
ob_end_flush()
Send output buffer (output buffer) and disable the output buffering mechanism.
ob_end_clean()
Clear the output buffer but not send it, and disable output buffering.