当使用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 错误,因此您不需要使用 @ 错误抑制器。