我不认为这是合理的。
为什么它实际上是这样的规则?
在“正常情况下”,我认为不必ob_start
在之前调用session_start
- 也不是相反。
不过,引用手册页session_start
:
session_start() 将在启用 trans-sid 时注册用于 URL 重写的内部输出处理程序。如果用户使用 ob_gzhandler 或类似 ob_start(),输出处理程序的顺序对于正确输出很重要。例如,用户必须在会话开始前注册 ob_gzhandler。
但这是一种特殊情况:这里的问题是,输出处理程序的顺序很重要:如果您希望一个处理程序修改另一个处理程序所做的事情,它们必须以“正确”的顺序执行。
通常,如果您不使用那种处理程序(例如,Apachemod_deflate
在压缩输出方面做得很好),唯一重要的是在您调用之前不能发送标头session_start
(因为,取决于您的配置session_start
发送 cookie,这些 cookie 作为 HTTP 标头传递)。
只要必须发送任何数据,就会发送标头 - 即,只要有任何输出,即使是<?php ?>
标签之外的一个空格:
注意:如果您使用基于 cookie 的会话,则必须在将任何内容输出到浏览器之前调用 session_start()。
ob_start
表示 PHP 必须缓冲数据:
此功能将打开输出缓冲。当输出缓冲处于活动状态时,不会从脚本发送输出(除了标题),而是将输出存储在内部缓冲区中。
这样,在您自己说“发送数据”之前,不会发送输出。这意味着标头不会立即发送 - 这意味着session_start
可以稍后调用,即使应该有输出,如果ob_start
没有使用。
希望这能让事情更清楚一点......
如果默认情况下您output_buffering
是Off
并且您不幸将单个字节的数据发送回客户端,那么您的HTTP
标头已经发送。这有效地防止session_start()
了将 cookie 标头传递回客户端。通过调用ob_start()
您启用缓冲并因此延迟发送 http 标头。
session_start
might want to modify the HTTP header if certain configuration options are set. One for example is session.use_cookies that requires to set/modify the Set-Cookie header field.
Modifying the HTTP header requires that there isn’t any output that’s already sent to the client as the HTTP header is sent right before the first output is sent.
So you either ensure that there is absolutely no output before the call of session_start
. Or you use the output buffering control to buffer the output so that the HTTP header can be modified even if there already is output.
session_start()
trans-sid
启用时将为 URL 重写注册内部输出处理程序。如果用户使用ob_gzhandler
或喜欢 with ob_start()
,则输出处理程序的顺序对于正确输出很重要。
例如,用户必须ob_gzhandler
在会话开始之前注册。
但这是某种特殊情况。在这里,输出处理程序的顺序很重要。如果您希望一个处理程序修改另一个处理程序所做的事情,则必须以“正确”的顺序执行它们。
通常,如果您不使用那种处理程序(mod_deflate
例如,Apache 在压缩输出方面做得很好),唯一重要的是在您调用之前不能发送标头session_start
(因为,取决于您的配置,session_start
发送作为 HTTP 标头传递的 cookie)。
只要必须发送任何数据,就会发送标头 - 即,只要有任何输出,即使是<?php ?>
标签之外的一个空格:
注意:如果您使用基于 cookie 的会话,则必须session_start()
在任何内容输出到浏览器之前调用。
ob_start
表示 PHP 必须缓冲数据:
此功能将打开输出缓冲。当输出缓冲处于活动状态时,不会从脚本发送输出(除了标题),而是将输出存储在内部缓冲区中。
这样,在您自己说“发送数据”之前,不会发送输出。这意味着标头不会立即发送——这意味着 session_start 可以稍后调用,即使应该有输出,如果ob_start
没有使用。
session_start(); 应该在发送任何标头之前调用。ob_start() 将抑制输出一段时间,您可以打破此规则。通常顶部的 ob_start() 是一个快速修复,以防你正在调试未知的东西;下面的一切都按预期工作(不仅仅是写的;-))。我更喜欢在 session_start() 之后使用 ob_start()。