【问题标题】:How does ob_get_contents work in Php?ob_get_contents 在 PHP 中是如何工作的?
【发布时间】:2013-01-18 06:43:29
【问题描述】:

这是我正在阅读的书中的示例代码:

ob_start();
include("{$path}.ini");
$string = ob_get_contents();
ob_end_clean();
$pairs = parse_ini_string($string);

我的问题是,ob_get_contents() 如何知道从什么获取内容? (在这种情况下是 {$path}.ini)?

【问题讨论】:

标签: php ob-get-contents


【解决方案1】:

ob_get_contents 只是获取输出缓冲区的内容,因为您调用了ob_start()。本质上,PHP 中的输出缓冲区会捕获任何本来可以输出 到浏览器的内容(不包括标题)。如果您可能需要过滤某些输出,或者您正在使用将输出直接写入屏幕的 PHP 方法(例如var_dump),并且您希望该方法的返回值以字符串形式显示,那么它很有用。

在这种情况下,因为你include()ing .ini 文件,它的内容将基本上输出到屏幕,ob_get_contents() 将获得文件的内容。

如果您将echo "I'm a little teapot short and stout"; 放在include 下方,这也将包含在$string.ini 文件正文之后。

但是,在您的特定情况下,输出缓冲是不必要的开销,只需在 .ini 文件上使用 file_get_contents。我不知道为什么一本书甚至会包含这个代码。

【讨论】:

  • 只是一个简单的问题,当您说“因为您包含().ini 文件,它的内容将基本上输出到屏幕”,但我没有看到路径的内容.ini 在屏幕上?
  • ... 因为您使用的是输出缓冲,所以这就是重点。 ob_end_clean() 删除输出缓冲区的内容(现在在$string 中),除非你echo $string;,否则它永远不会输出到屏幕上。
  • @KorayTugay 当你删除 ob_start() 函数时,你会在屏幕上看到它。
  • @Burgos 谢谢,删除 ob_end_clean();不是 ob_start()...奇怪..
  • 因为ob_start() 只是开始捕获,如果您不清除(使用ob_end_clean())缓冲区,它将在脚本结束时刷新到您的屏幕。
【解决方案2】:

“ob”代表“输出缓冲区”。当您调用ob_start() 时,PHP 将所有输出(使用echo 等)重新路由到输出缓冲区。然后您可以使用其他ob_* 函数来检索和/或清除缓冲区内容。

在您的示例中,它将缓冲由"{$path}.ini" 引用的文件生成的任何输出。当你包含它时,它的输出被添加到缓冲区中,当你调用ob_get_contents()时,它检索缓冲区的内容。

【讨论】:

    【解决方案3】:

    来自 PHP:

    ob_start — Turn on output buffering
    ob_get_contents — Return the contents of the output buffer
    ob_end_clean — Clean (erase) the output buffer and turn off output buffering
    

    现在,ob_get_contents 可以收集所有输出的缓冲区。

    [1]http://www.php.net/manual/en/book.outcontrol.php

    【讨论】:

    • “输出的缓冲区”包括什么?
    • 输出没有打印出来,而是保存在内部缓冲区中,然后,php可以收集这个输出并保存在字符串中
    【解决方案4】:

    ob_get_contents() 正在获取调用ob_start() 函数后回显的所有内容,因此{$path}.ini 没有什么特别之处 - 您需要回显要收集的数据(是的,即使是简单的echo 的输出或 print_r 调用将被收集 - 有时对调试简单脚本很有用)。

    您可能将ob_start() 函数理解为从屏幕到(不可见)PHP 内部缓冲区的简单重定向,该缓冲区稍后会被ob_get_contents() 读取。因此,您无需调用ob_start() 函数(甚至是整个网页)即可重定向您在屏幕上看到的任何内容。

    【讨论】:

    • 但 {$path}.ini 从未回显?
    • @KorayTugay 内容是,你叫include
    • @RudiVisser 除了echo、print_r和include,还有什么被认为是echoed?
    • @KorayTugay 无需调用ob_start() 函数即可在浏览器中看到的任何内容。您可能将其理解为从屏幕到某个容器的简单重定向数据。
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多