PHP:使用“ ob_ *”函数进行自己的缓冲

时间:2018-08-08 14:34:46

标签: php buffer

我已经进行了设置,所以我的代码读取了每个页面的文本,并自动从中生成目录和脚注列表。我将脚注文字放在页面文字所引用的位置。当代码读取页面文件时,它将根据页眉构造一个目录,并将其放在页面的开头。它还会删除脚注的文本,并将其放在页面末尾的列表中。它还管理脚注的编号以及为其链接的上标脚注编号的位置。

为此,我将内容编译为变量$PageText,而不是echo()处理页面内容。然后,我具有读取该变量,删除脚注文本,编译目录和脚注列表并将其插入$PageText中的函数。然后我echo($PageText);

看来我在这里做的是一种自制的缓冲形式,并且我可以通过类似的方式完成同样的事情

ob_start();
echo(<page contents>);
$PageText = ob_get_contents();
make_ToC($PageText);
make_footnotes($PageText);
ob_end_flush();

使用我自己的缓冲区变量会更有效吗?还是出于其他原因,最好使用内置缓冲系统?

我喜欢使用自己的缓冲区的原因是我可以完全控制它。我真的不知道在echo()到刷新之间,PHP可能决定如何处理内容。

五年前,有人问过类似的问题,Output buffering vs. storing content into variable in PHP。有趣的是,答案似乎表明我可以通过使用“ ob_”系统更好地控制内容,而我感觉可以通过使用自己的变量来更好地控制内容。我对此不了解吗?

1 个答案:

答案 0 :(得分:1)

输出缓冲是一种将已生成的输出置于保留状态的技术,它具有许多用途:

  • 更好地利用网络传输(例如避免发送几乎空的HTTP包)
  • 应用透明的转换(例如,缩小生成的HTML或重写URL)
  • 能够完全取消输出(例如在发生错误的情况下)
  • 捕获打印到标准输出的函数的输出(例如var_dump()

以我的经验,特别是打印到标准输出的功能很烦人。如果这样做的唯一明显原因是不必加上echo,因为它们会妨碍您的应用程序设计。您并不总是希望按原样发送它们的输出,也不总是希望在函数调用发生的响应流的确切位置打印输出。

您所描述的基本上是您可以在任何程序中期望的标准文本操作。虽然您当然可以使用输出缓冲来模拟它,并且可以得到它的认可,但我认为这感觉像是黑客。在您的情况下,您甚至没有进行线性输出。立即打印到stdout没有明显的好处,因为您还需要处理输出,因为它尚未准备好。