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
)将仅刷新输出