PHP 提供了两种相关的刷新(发送并丢弃系统缓冲区内容)方法:通过调用 flush() 和通过使用 ob_implicit_flush() 或 implicit_flush php.ini 设置启用隐式刷新。
禁用隐式刷新时,PHP 仅在调用 flush() 或脚本结束时刷新输出。
启用隐式刷新时,PHP 将尝试在导致输出的每个代码块之后刷新。此处的输出是指长度非零的数据,它
<?php ?>
标签之外
php://output
的任何内容
注意: 打印空字符串或发送标头不被视为输出,不会导致刷新操作。
如果启用了隐式刷新,控制字符(例如 "\n"
、"\r"
、"\0"
)也会触发刷新。
此功能无法刷新用户级输出缓冲区。要将它们一起使用,用户级输出缓冲区必须在刷新系统缓冲区之前刷新,以便 PHP 产生任何输出。
调用 flush() 或启用隐式刷新可能会干扰用户级输出缓冲区的输出处理程序,这些处理程序在 Web 上下文中设置和发送标头(例如 ob_gzhandler()),方法是在这些处理程序可以执行此操作之前发送标头。
底层软件/硬件实现的缓冲不能被 PHP 覆盖,在使用 PHP 的缓冲控制函数时应将其考虑在内。检查 Web 服务器/浏览器/控制台的缓冲设置并使用它们可以缓解可能出现的问题。在 Web 上下文中,可以调整 Web 服务器的缓冲设置或脚本的缓冲设置以协同工作,而通过调整 PHP 脚本中的缓冲可以绕过各种浏览器的缓冲策略。在实现行缓冲的控制台上,可以在刷新输出之前在适当的位置插入换行符。
尽管每个 SAPI 都以稍微不同的方式实现刷新,但这些实现属于以下两种类别之一
Apache2Handler
、CGI
、FastCGI
和 FPM
就是此类 SAPI
CLI
和 embed
)只会刷新输出