输出缓冲

输出缓冲是在将输出冲刷(发送和丢弃)到浏览器(在 Web 上下文中)或 shell(在命令行上)之前对输出进行缓冲(临时存储)。当输出缓冲处于活动状态时,脚本不会发送任何输出,而是将输出存储在内部缓冲区中。

缓冲影响 PHP

PHP 在冲刷输出时依赖底层软件/硬件基础设施。由命令行上(例如行缓冲)的控制台或 Web 上下文中的 Web 服务器和浏览器(例如完全缓冲)实现的缓冲确实会影响向终端用户显示输出的时间。其中一些影响可以通过微调服务器设置和/或调整各层的缓冲区大小来排除。

PHP 中的输出缓冲控制

PHP 提供了全缓冲的用户级输出缓冲区,包含启动、操作和关闭缓冲区的函数(大多数 ob_* 函数),以及两个刷新底层系统缓冲区的函数(flush()ob_implicit_flush())。其中一些功能也可以使用合适的 php.ini 配置来设置。

用例

输出缓冲通常在修改或检查缓冲的输出或者在请求中多次使用时有用;或者当需要控制输出的冲刷时。具体用例包括:

  • 通过生成静态 HTML 页面来缓存计算/时间密集型脚本的结果
  • 通过显示、保存到文件或通过电子邮件发送来重新使用生成的输出
  • HTML 页面的 headbody 分开冲刷,允许浏览器在脚本执行潜在的更耗时的任务(例如数据库/文件访问、外部网络连接)时加载外部资源。这只有在发送 header 后 HTTP 状态代码不能更改时才有用
  • 从原本会产生输出的函数中提取信息(例如 phpinfo()
  • 通过修改/使用部分(例如提取数据、替换字/词组、添加缺失的 HTML 标签)来控制第三方代码的输出,或在某些条件下(例如错误)完全丢弃它
  • 填充某些不可用的 Web 服务器功能(例如压缩或编码输出)