PHP中flush()与ob_flush()的区别

首先先讲一下缓冲区,从http请求开始到将数据展现在屏幕上,数据有可能经过以下的缓冲区:php缓冲区,sapi(fast-cgi,cli等)缓冲区,浏览器缓冲区等。
php缓冲区可以理解为php自带的数据输出缓冲期,在php的配置文件中,有如下设置
这里写图片描述
其中out_buffering默认大小为4k,也就是说如果我们的输出数据小于4k时,数据会先放到缓冲区并不会立即输出。等到数据攒足了4k在一起输出给sapi.

如果是http请求,一般php要和nginx或者apache打交道。我用的是nginx,在这里贴出配置
这里写图片描述
其中fastcgi_buffer_size 存放的是返回给客户端的http的头部信息。这里要说明一下,上面提到的php缓冲区是不存放header信息的,只缓冲要返回给客户端的内容。
其中fastcgi_buffers 代表有4块大小为64k的缓冲区。等到fastcgi_buffers数据“满了”webserver才会发送给网络上的客户端。

当php在cli模式下运行的时候,是没有sapi缓冲区的,但是仍然具有php缓冲区。

说完缓冲区再说说flush()和ob_flush()。
flush()在我的理解看来就是输出sapi的缓冲数据。
ob_flush()的作用范围其实是php缓冲区,他一般是和ob_start()一起用的。一旦php代码遇到ob_start(),那么直到遇到ob_flush()之后才会将数据输出,即使数据大于php配置文件中out_buffering的值。

有的小伙伴在使用nginx的时候发现flush()不起作用。这是因为php与nginx和与apache工作的方式不一样。与apache,php是作为apache的工作模块运营的,因此调用flush()函数刷新sapi缓冲区的时候也告诉了apache向用户输出数据。但是nginx不是这样的,php通过通用网关接口与nginx通信,因此从php传过来的数据要大于fastcgi_buffers的大小才会被nginx输出。所以如果你用的是nginx,那么请忘记flush()吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值