我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文对上一篇文章中分段输出内容的情况进行进一步分析,分析的主要焦点在于代码中flush()函数。从运行效果上来看,flush()代码执行与否,最终的效果都是会分段输出。那么,flush()究竟作用是什么呢?本文做个非常简单的分析。

苏南大叔:php缓存,如何理解flush()函数?flush函数如何生效 - php-flush
php缓存,如何理解flush()函数?flush函数如何生效(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验文章。测试环境:win10php-cgi@8.2.11ntschrome@120.0.6099.201

测试环境

本文是基于下面这篇文章进行扩展描述的。需求就是分段输出,服务的启动方式就是纯php后端,不掺杂nginx任何事情。php.ini中的设置就是output_buffering。参考文章:

本文的测试环境里面,写了两个不同的php.ini,区别就在于:

  • php.inioutput_bufferingoff,也就是关闭系统缓存。
  • php2.inioutput_buffering1024,打开系统缓存区,设置为1024字节。

利用php-c参数设置不同的端口对应不同的php.ini,从而创造两个不同环境。

cd <php_path>
php -S localhost:<port> -c <php_path>\php.ini -t <www_path>

苏南大叔:php缓存,如何理解flush()函数?flush函数如何生效 - output-buffering-command
php缓存,如何理解flush()函数?flush函数如何生效(图3-2)

测试代码

测试代码也有两个,区别在于是不是启用了flush()
test.php:

echo "output_buffering:",ini_get("output_buffering"), "<br/>";
flush();
sleep(3);
echo date("i:s",time()), PHP_EOL;
flush();
sleep(3);

test2.php:

echo "output_buffering:",ini_get("output_buffering"), "<br/>";
// flush();
sleep(3);
echo date("i:s",time()), PHP_EOL;
// flush();
sleep(3);

flush()效果1

在没有开启output_buffering的时候,测试代码的效果上来看,带不带flush()暂时没有区别。(或者说区别细微到看不出来),都是期待中的分段输出。

output_buffering = off

flush()效果2

在开启了output_buffering的时候,无论是否使用flush(),分段输出效果都不存在了。(待后续讨论)

output_buffering = 1024

并且,带不带flush()有着比较明显的区别。区别在于:

  • flush()的时候,页面多次刷新过程中,有空白的过程。浏览器的转圈图标是正向的。(意味着等待服务器输出持续了较长时间)
  • 不带flush()的话,页面多次刷新过程中,没有空白的过程。浏览器的转圈图标是逆向的。(意味着一直等待服务器输出)

苏南大叔:php缓存,如何理解flush()函数?flush函数如何生效 - 执行效果
php缓存,如何理解flush()函数?flush函数如何生效(图3-3)

苏南大叔的理解是:flush()的过程中,由于数据被output_buffering给缓存了,所以刷了空白数据出来。

结语

本文仅仅是对php的自带缓存的一小小点的探索而已。更多php经验文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php