I don't think it's reasonable.
Why is it actually such a rule?
The ob_start() function creates an output buffer. A callback function can be passed in to do processing on the contents of the buffer before it gets flushed from the buffer. Flags can be used to permit or restrict what the buffer is able to do.
session_start() creates a session or resumes the current one based on a session identifier passed via a GET or POST request, or passed via a cookie. When session_start() is called or when a session auto starts, PHP will call the open and read session save handlers.
Note: The session_start() function must be the very first thing in your document. Before any HTML tags. As for your question you can start session wherever you want, but beware that session must be started before any output. So it is considered a reasonable approach to start session at the top of a page.
It must be on every page you intend to use. The variables contained in the session—such as username and favorite color—are set with $_SESSION, a global variable. In this example, the session_start function is positioned after a non-printing comment but before any HTML.
In the "normal case", I don't think ob_start
has to be called before session_start
-- nor the other way arround.
Quoting the manual page of session_start
, though :
session_start() will register internal output handler for URL rewriting when trans-sid is enabled. If a user uses ob_gzhandler or like with ob_start(), the order of output handler is important for proper output. For example, user must register ob_gzhandler before session start.
But this is some kind of a special case : the thing is, here, that the order of output handlers is important : if you want one handler to modify things the other did, they have to be executed in the "right" order.
Generally, if you don't use that kind of handlers (Apache and mod_deflate
do a great job when it comes to compressing output, for instance), the only thing that matters is that headers must not be sent before you call session_start
(because, depending on your configuration, session_start
sends cookies, which are passed as HTTP headers).
And headers are sent as soon as any piece of data has to be sent -- ie, as soon as there is any output, even one whitespace outside of <?php ?>
tags :
Note: If you are using cookie-based sessions, you must call session_start() before anything is outputted to the browser.
ob_start
indicates that PHP has to buffer data :
This function will turn output buffering on. While output buffering is active no output is sent from the script (other than headers), instead the output is stored in an internal buffer.
This way, output is not sent before you actually say, yourself, "send the data". This means headers are not send immediatly -- which means session_start
can be called later, even if there should have been output, if ob_start
had not been used.
Hope this makes things a bit more clear...
If by default your output_buffering
is Off
and you have been unfortunate enough to send a single byte of data back to the client then your HTTP
headers have already been sent. Which effectively prevents session_start()
from passing the cookie header back to the client. By calling ob_start()
you enable buffering and therefore delay sending http headers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With