Easy-to-follow video tutorials help you learn software, creative, and business skills.Become a member
In the last two movies we talked about headers and redirection. And one of the very important points about working with headers and redirection is that they have to come before any output to the HTML. And I stressed that several times. Unless there's one big caveat, which is that we can have output buffering turned on. And that's what we're going to talk about in this movie is what output buffering is. And how it works. Let me give you a metaphor to illustrate. Let's imagine, for a moment that our PHP code is a faucet and our web server is a glass.
And we're going to fill up that glass with the output of the HTML. So as we execute our PHP, code the output line by line is being sent to the web server. The web server as soon as it gets the first little drop of water has the headers established for what it's going to send. That's why we can't change them after we start sending that code or the water to it. And then once the page has completely finished rendering, then the web server will take that information that it has gathered up and send it all off to the browser.
So it accumulates in the web server. The web server starts the headers for it, accumulates all the data behind it and when it's done, ships it out the door. Now let's imagine that instead we have our PHP code of the web server but we have PHP's output buffer that's like a measuring cup. And instead of filling the glass directly we're going to fill up the measuring cup first. So that's what fills up with all our data and then when it's full or when we get to a certain point, a certain measure. We're going to take and then send it over to our web server. And fill up our web server with it and send it off. That's how output buffering works.
While it's still there in that measuring cup, it's still inside php, we still have access to it. That's why we're able to modify the headers. We haven't given anything over to the web server yet. We have it still in our buffer, change the headers in the buffer then it'll go to the web server at the end and at that point the headers have all been established by our PHP code. That's what output buffering is. Now we do pay a small performance penalty by turning on output buffering because we do take the time to do this extra step. We take a little bit of time to tell PHP put things together before you send them out the door instead of just expressing them right on to the web server. But I think that you'll find in most cases the performance penalty is not that high and the benefits to gain by having output buffering are pretty significant. There are two ways we can turn on this output buffer. The first is that we can open up our php.ini file and make the adjustment there.
The second is that we can do it on a page by page basis. So first let's open up our php.ini file. You'll remember that early on in the configuration chapter we set up in our sandbox something called my_phpinfo.php. And that should bring up all of your php info. And if we search that page for B,U,F,F,E,R. You'll see output buffering. Output buffering for me has no value. That means that it is turned off, it is not doing output buffering. If it had a size there, then that would be the size of our measuring cup.
That's how much it's going to buffer before it sends it. So let's remind ourselves where our php.ini file lives. If we go up to the top, you'll see that it tells us the loaded configuration file is right here at this path. So that's where it's located. Let's open up our command line and I'm just going to do nano on that file, php.ini. That's going to open it up in the Nano Text Editor and let's go ahead and do a find for output buffering. Ctrl+W allow me to search inside of there and I'm going to just look for buffer, output buffering, so it shows you the default value is off, development value 4096.
That's a pretty good and standard value, that 4096. But this is just code comments. This is not the actual setting of it. Let's just do another search in here, Ctrl+W, search for buffer again. All right, here's a paragraph all about output buffering. It explains how it works. It's everything that I just told you and a little bit more. And it goes on to then tell you that the possible values are On Off, or an integer. So right now we scroll down a little bit more, you'll see that mine is turned off. We did that back in the configuration. We made sure that it was turned off for this reason. Now I'm going to turn it back on.
Now I could simply type on but instead of having an unlimited output buffer, I'm going to go ahead and give it a limit. That's the idea of the measuring cup here that it will fill up at some point. It will take 4,000 characters before it fills up. So I have 4,000 characters in which to still change my headers before the output buffer is full and it sends it to the web server for the first batch. So now that I have that change. I can exit using Ctrl+X. And let's type a y for save the changes. And a Return to save them in place. Now you'll need to restart your web server.
Sudo apachectl restart. Wants my password. And there it is that's my password used to install software. Now it has restarted and my output buffering should be turned on. If we come back over here, we reload this page and once again search for buffer. I'll put buffering as now 4096, now output buffering is turned on. That means now that if you went back to the previous two movies again with modifying headers and page redirection you would be able to send white space before you do those redirects and header modifications.
Now addition to turning in on all the time for all the pages in the php and I can also turn it on on a page by page basis. And I do that by using a PHP function called ob_start for output buffer start and then when I'm done output buffer end flush. So that's going to start the buffer. Everything that happens after that will go in the buffer. And at the end I have to say okay, I'm done now. You're free to flush this over to the web server.
So your page starts with ob_start and ends with ob_end_flush. Very important though, ob_start has to come before any content. Just the same as the headers, otherwise we won't have started the output buffer. Will output a little bit of HTML. The headers are already sent, then we turn on the buffer but it's too late. So it has to be the very first thing that we do. Also it won't hurt to turn it on again if you've already turned it on in the php.ini file. So which one should you use? Should you set your php.ini file or should you set it in your application? I would say that it's better to set it in the php.ini file so you don't forget to do this for any page.
So if you just have it set there then it will always be on. However you need to understand that it means that if you put it on a server where it is not enabled it's not going to work. You're going to have to make sure the php.ini file has output buffering turned on and by default it usually is now so that shouldn't be a problem. If you're in doubt, if you're creating something that is going to go out to other servers out there and you're not in control of those php.ini files, then I would say use the page by page version and just make sure that you do it application-wide.
Maybe it's something that you always include in your template so that it always starts and ends the output buffering before you do anything else. And that way you'll get the maximum amount of compatibility. But for yourself, I think you can just turn it on your php ini file and be just fine.
Get unlimited access to all courses for just $25/month.Become a member
61 Video lessons · 99509 Viewers
56 Video lessons · 112732 Viewers
71 Video lessons · 81550 Viewers
131 Video lessons · 39147 Viewers
Access exercise files from a button right under the course name.
Search within course videos and transcripts, and jump right to the results.
Remove icons showing you already watched videos if you want to start over.
Make the video wide, narrow, full-screen, or pop the player out of the page into its own window.
Click on text in the transcript to jump to that spot in the video. As the video plays, the relevant spot in the transcript will be highlighted.