了解 ob_start() 的奇怪用法?

Understanding odd usage of ob_start()?

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

"Warning: Cannot modify header information - headers already sent". at the following link:

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

几年前我在这个网站上查看了解决方案,但其中 none 似乎有效,尽管这些解决方案是有意义的。

但是这个对我有用的 utube 解决方案毫无意义,我想知道是否有人可以解释为什么?

我无法使用 header('location: filename') 打开新网页。我一直收到警告。我将 ob_start() 添加到索引页面的开头(根据视频,带有 header 指令的 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");

如果在发送 http headers 之前输出任何内容,则会发生 "Cannot modify header information" 错误。

ob_start() 启动了一个名为 "output buffering" 的 php 功能,它将阻止 php 直接输出数据(到浏览器)。相反,所有输出都是 "redirected" 到缓冲区,并且只有在 ob_flush() 被调用时才会变成输出,这又会清除缓冲区。

在您的示例中 ob_start() "captures" 在 headers 之前创建的任何输出都会被发送并解决您的问题。由于脚本中没有 ob_flush() 所有以前创建输出 "vanishes".