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