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

故事是这样的,苏南大叔要使用php输出一些文字内容。但是,目标并不在于“输出”,而是在于小批量分段输出,重点就是【分步】。那么,正常情况下,这个需求的实现,有很多不同层次上的障碍,这些障碍都源自于“缓存”。

苏南大叔:php如何修改缓存设置?做到内容及时分步输出? - php分段输出
php如何修改缓存设置?做到内容及时分步输出?(图2-1)

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

不同层次缓存

因为正常情况下,是使用nginxphp来进行组合的。php层面上有缓存,nginx层面上也有缓存。为了更好的说明问题,本文的测试环境,仅仅使用php,不使用nginx或者apache。这样就可以把出问题的情况缩小到php和浏览器之间了。

使用的命令是:

php -S localhost:8000 -c php.ini

这里指定php.ini的原因是:要对php.ini的配置进行修改。而默认不传递-c参数的话,无法修改配置。参考文章:

php.ini中的buffer

对于php来说,自身是有缓存设置的,代码输出超过一定的值后,才会输出。体现在php.ini中的设置是output_buffering。其参考值如下:

基本情况
Default ValueOff
Development Value4096
Production Value4096
4096字节 = 4kb。

官方文档:

在本文中,就直接设置如下即可:

output_buffering = off

测试代码

echo ini_get("output_buffering");
echo "<br/>";

echo "分步输出第一步";
flush();

sleep(2);
echo "第二步";
flush();

sleep(2);
echo "第三步";
flush();

苏南大叔:php如何修改缓存设置?做到内容及时分步输出? - 分步输出截图
php如何修改缓存设置?做到内容及时分步输出?(图2-2)

目标是每隔2秒输出“第x步”三个字。如果不是分步输出的话,可以注意检查:

  • output_buffering的输出值是什么,目标数据是0,也就是说关闭php系统的output_buffering选项。
  • 代码中的flush()是个关键点,关于这个代码的用法,待后续文章补充。
  • 注意本例子里面只有php,没有nginx的参与。

结语

苏南大叔的更多php经验文章,请参考:

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

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

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

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