PHP缓存区output_buffering分析和实际应用

在php.ini里面output_buffering的默认是on

php输出之后不会立马输出,而是先到达buffer(缓存区),当buffer满了或者运行完毕之后才将数据输出出去
<?php
echo 1;
echo “<hr/>”;
$buffer = ob_get_contents();//只是得到输出缓冲区的内容,但不清除它
echo $buffer;

默认情况下
PHP进行输出(echo,var_dump,print_r)->PHP缓存->系统缓存(apache、nginx)->浏览器缓存->浏览器显示
echo->php buffer->webServer buffer->browser buffer->browser display
上面程序这时输出
1
1

关闭了output_buffering
echo->webServer buffer->browser buffer->browser display
上面程序这时输出而不输出缓存中的信息
1
当然可以通过ob_start();进行手动开启
<?php
ob_start();
echo 1;
echo “<hr/>”;
$buffer = ob_get_contents();//只是得到输出缓冲区的内容,但不清除它
echo $buffer;
上面程序这时输出
1
1

在php.ini里面output_buffering(开启情况下)的默认值是4096(4kb)
可以使用ob_start()手动激活php buffer,这样即使超过4kb也不会输出到浏览器中,而是输出到buffer
可以使用ob_end_flush()或者ob_end_clean() 关闭输出到buffer

ob_end_flush()
只是把PHP缓冲区中的数据发送到客户端浏览器,调用之后
PHP缓冲区中的数据依然存在,ob_get_contents()依然可以获取PHP缓冲区中的数据拷贝

ob_clean_clean()
将PHP缓冲区中的数据删除,但不发送给客户端。

实际应用中
1.静态文件的缓存
有很多程序后台都会有生成首页文件,生成静态化文件等功能
适合不经常更改数据,需要反复读取数据页面
这样可以使用户直接读取静态文件而不需要通过PHP处理业务
2.header,session,cookie
<?php
echo 1;
header(“content-type:text/html;charset=’utf-8′”);//session_start() SetCookie()
//在程序中echo 1;已经给浏览器发送了一个头部信息,当运行到header()就会继续发送并更改了之前头部的信息

<?php
ob_start();
echo 1;
header(“content-type:text/html;charset=’utf-8′”);
当使用ob_start()之后就会把echo 1;的输出信息到了buffer中,页面结束之后吧缓存按照http协议返回给浏览器

3.文件下载
很多时候回使用PHP下载文件比如数据导出,如果是大文件,需要读入到内存传输给用户,这样会导致响应时间变长
使用缓存进行一部分一部分的读取之后进行缓存最后进行传输,这样可以降低内存,浏览器持续接收数据

此条目发表在PHP分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注