在脚本顶部调用一次 ob_end_clean() 是否永远不需要 ob_flush()


Does calling ob_end_clean() once at the top of a script guarantee ob_flush() is never needed?

当使用PHP作为SSE(服务器发送事件)和类似服务器流解决方案的后端时,我一直在使用@ob_flush();@flush()习语来确保数据立即被吐出。 (排序很重要:ob_flush()刷新PHP的缓冲区,然后flush()告诉Apache也刷新它。

读到@慢之后,我开始思考这个问题。(事实上,根据 PHP 手册中的注释,它增加了大约 0.005 毫秒,所以我将"慢"重新归类为"除非在紧密循环中,否则不要担心它")。我需要ob_flush()上的@在输出缓冲区为空时停止它抱怨。顺便说一句,我已经遵循了源代码,直到它到达 Apache,它似乎flush()没有抛出任何 PHP 错误。

现在我想知道我是否可以将上述@ob_flush();@flush()减少到仅@flush()(甚至只是flush())?再次在PHP手册注释中,我发现有人说你可以在脚本的顶部这样做:if (ob_get_level()) ob_end_clean();(可以缩写为简单的@ob_end_clean();

我的问题是:这是一个可靠的命令,意味着永远不会使用输出缓冲,也永远不会需要ob_flush()?在所有PHP版本(至少PHP 5.2及更高版本)和所有支持的操作系统中,用户可能在php.ini中进行了任何奇怪的设置?

(如果您的回答是"否",请描述在哪些情况下仍可能需要ob_flush()

也许这就是你要找的:http://www.php.net/manual/en/function.ob-implicit-flush.php

//at start of script...
ob_implicit_flush(true);
ob_end_flush();

返回无缓冲输出

旁注:在生产环境中,您不应该在屏幕上显示 php 错误,因此您不需要使用 @ 错误抑制器。