• 欢迎来到我的博客
  • [email protected]

PHP 输出缓冲区

学习笔记 tianlan 7个月前 (08-09) 293次浏览 0个评论 扫描二维码
文章目录[隐藏]

是什么

当我们使用 echo 等输出的时候,php 会立刻返回给 nginx,然后 nginx 返回给浏览器。

当我们开启 输出缓冲区 的时候,输出内容会先放到 缓冲区,然后我们可以调用函数将 缓冲区 的内容返回给 ngxin。

运用实例

header()

大家都知道,在 header() 前不能有输出内容。

因为你都输出内容到 nginx ,nginx 返回给浏览器了,也就是响应了这个请求,http 响应头是已经确定下来了的,不能再去修改的!

但是如果我们用 输出缓冲区 就可以解决这个问题:
因为 header() 是不受缓冲区影响的,当一碰到header(),PHP 马上通过 nginx 发送这一个 http 头到浏览器。
而之前输出的数据将会存放在缓冲区,等待输出.这样就可以避免了之前所发生的错误.

通过PHP写下载程序的时候

为了让文件下载更安全,同时提高更多的可控性,很多朋友都喜欢用PHP写文件下载页面.其原理很简单,就是通过fwrite把文件内容读出并显示,然后通过header来发送HTTP头,让浏览器知道这是一个附件,这样就可以达到提供下载的效果.

如果用上面的办法提供下载页面,会碰到一个效率问题,如果一个文件很大,假设为100M,那么在不开启缓冲区输出的情况下,必须要把100M数据全部读出,然后一次返回到页面上,如果这样做,用户将会在所有数据读完之后才会得到响应,降低了用户体验感.

如果开启了输出缓冲区,当PHP程序读完文件的某一段,然后马上输出到apache,然后让apache马上返回到浏览器,这样就可以减少用户等待时间.那后面的数据怎么办呢?我们可以写一个while循环,一直一段一段地读取文件每读一段,就马上输出,直到把文件全部输出为止,这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕.

另外,该做法还解决了另外一个很严重的问题.例如一个文件是100M,如果不开启缓冲区的情况下,则需要把100M文件全部读入内存,然后再输出.但是,如果PHP程序做了内存限制呢?

为了保证服务器的稳定,管理员通常会把PHP的执行内存设一个限制(通过php.ini总的memory_limit, 其默认值是8M), 也就是每个PHP程序使用的内存不能使用超过这个值的内存.

假设该值为8M,而要读入的文件是100M,根本就没有足够的内存来读入该文件.这个时候,我们就需要用到上面的办法来解决这个问题,每次只读某一段,这样就可以避免了内存的限制

静态文件缓存

现在很多公司有这么一个需求, 就是某一个页面在第一次访问的时候,会执行PHP,然后把显示的内容返回到浏览器,同时需要把这次显示的内容保存到服务器上,这样下次访问的时候,就直接把保存在服务器上的文件直接显示,而不需要通过PHP来做操作
这就是所谓的”静态页面缓存”.那怎么样才能做到把内容返回到浏览器的同时把数据保存到服务器上呢?这就要用到输出缓冲区了.

1
2
3
4
5
6
ob_start();
echo 'aaa';
$string = ob_get_contents();
file_put_contents('a.html', $string);
ob_flush();
flush();

PHP相关文档

https://www.php.net/manual/zh/book.outcontrol.php


天蓝, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP 输出缓冲区
喜欢 (0)
[[email protected]]
分享 (0)

您必须 登录 才能发表评论!