了解ob_start()的奇怪用法?

时间:2018-01-31 21:08:42

标签: php caching ob-start

我在utube上发现了一个关于预防警告的视频:

  

“警告:无法修改标头信息 - 已发送的标头”。在   以下链接:

https://www.youtube.com/watch?v=leIz1Q2LJr4

我在几年前看过这个网站上的解决方案,但是这些解决方案似乎都不起作用,尽管解决方案很有意义。

然而,这个对我有用的解决方案毫无意义,我想知道是否有人可以解释原因?

我无法使用header('location: filename')打开新网页。我一直收到警告。我将ob_start()添加到我的索引页面的开头(带有标题指令的PHP部分,根据视频),突然警告消失,页面开始打开。为什么会这样?

我认为ob_start()涉及正在打开的新页面而不是当前活动文档?

我在这里添加了以下代码:

ob_start();
header('Content-Type: text/html');
header('X-Content-Type-Options: nosniff', false);
//stop cacheing of page
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Pragma: no-cache"); // HTTP/1.0
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("X-XSS-Protection: 1");
header("X-Frame-Options: SAMEORIGIN");

1 个答案:

答案 0 :(得分:0)

如果在发送http标头之前输出任何内容,则会出现“无法修改标头信息”错误。

ob_start()启动一个名为“输出缓冲”的php功能,它将阻止php直接输出数据(到浏览器)。相反,所有输出都被“重定向”到缓冲区,并且只有在调用ob_flush()时才会将其转换为输出,从而清除缓冲区。

在您的示例ob_start()中,“捕获”在发送标头之前创建的任何输出并解决您的问题。由于您的脚本中没有ob_flush()所有以前创建的输出都“消失”。