【发布时间】:2009-09-20 13:13:08
【问题描述】:
我认为这不合理。
为什么它实际上是这样的规则?
【问题讨论】:
-
老实说:我没听说过这样的规定!
我认为这不合理。
为什么它实际上是这样的规则?
【问题讨论】:
在“正常情况”中,我认为 ob_start 不必在 session_start 之前被调用 -- 反之亦然。
引用manual page of session_start,虽然:
session_start() 将在内部注册 用于 URL 重写时的输出处理程序 trans-sid 已启用。如果用户使用 ob_gzhandler 或与 ob_start() 类似, 输出处理程序的顺序是 对正确的输出很重要。为了 例如,用户必须注册 会话开始前的 ob_gzhandler。
但这是一种特殊情况:这里的问题是,输出处理程序的顺序很重要:如果您希望一个处理程序修改另一个处理程序所做的事情,它们必须在“正确”中执行顺序。
通常,如果您不使用那种处理程序(例如,Apache 和 mod_deflate 在压缩输出方面做得很好),唯一重要的是标题不能在您调用session_start 之前发送(因为,根据您的配置,session_start 发送 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 如果设置了某些配置选项,可能想要修改 HTTP 标头。例如,session.use_cookies 需要设置/修改 Set-Cookie 标头字段。
修改 HTTP 标头要求没有任何输出已经发送到客户端,因为 HTTP header 是在发送第一个输出之前发送的。
因此,您要么确保在调用session_start 之前绝对没有输出。或者你使用output buffering control来缓冲输出,这样即使已经有输出也可以修改HTTP头。
【讨论】:
session_start() 将在启用trans-sid 时为 URL 重写注册内部输出处理程序。如果用户使用ob_gzhandler 或类似ob_start(),则输出处理程序的顺序对于正确输出很重要。
例如,用户必须在会话开始前注册ob_gzhandler。
但这是某种特殊情况。在这里,输出处理程序的顺序很重要。如果您希望一个处理程序修改另一个处理程序所做的事情,它们必须以“正确”的顺序执行。
通常,如果您不使用那种处理程序(例如,Apache 和 mod_deflate 在压缩输出方面做得很好),唯一重要的是不能在您之前发送标头调用session_start(因为,根据您的配置,session_start 发送 cookie,它们作为 HTTP 标头传递)。
只要需要发送任何数据,就会发送标头——即,只要有任何输出,即使是<?php ?> 标签之外的一个空格:
注意:如果您使用基于 cookie 的会话,则必须先调用 session_start(),然后才能将任何内容输出到浏览器。
ob_start表示PHP要缓存数据:
此函数将打开输出缓冲。当输出缓冲处于活动状态时,脚本不会发送任何输出(标题除外),而是将输出存储在内部缓冲区中。
这样,在您自己说“发送数据”之前,不会发送输出。这意味着标头不会立即发送 - 这意味着 session_start 可以稍后调用,即使应该有输出,如果 ob_start 没有被使用。
【讨论】:
session_start();应该在发送任何标头之前调用。 ob_start() 将抑制输出一段时间,您可以打破此规则。通常顶部的 ob_start() 是一个快速修复,以防你正在调试未知的东西;下面的一切都按预期工作(不仅仅是写的;-))。我更喜欢在 session_start() 之后使用 ob_start()。
【讨论】: