php的ob缓存详解
前言引入
先看下面的代码:
这个代码,每次输出后都有sleep(1),表示程序执行暂定一秒,想象中浏览器应该是每隔1s钟,逐渐显示1到5的,然后事实情况确不是,浏览器访问的时候,等了5s种后,页面上一下子出现1-55个数字的。这是为啥?
那么,我们能不能让浏览器每隔一秒钟逐步显示出1-5五个数字呢?
在看一段代码:
神奇的事儿发生,我们在浏览器上看到的情况是每隔一秒钟出现一个数字。实现了上面的梦想。
上面的代码中多了个flush,怎么就可以了呢?
解释上面的情况,我们就要引入下面我要说明的php的ob缓存了。
OB的基本介绍
那ob是啥呢?
ob就是output_buffer(输出缓存)的简写。在浏览器请求一个php页面的过程中,经历了三个缓存
1、ob缓存
2、程序缓存
3、浏览器缓存
上面第一个例子,之所以没有逐步输出数字,是因为在php端,把要输出的东西,全部先放到程序缓存,等全部处理完,在一起返回给浏览器,所以你看到的是同时打印1-5五个数字。
体验下OB
我们再来看看
运行下如下代码:
报了个警告:
为啥呢?哦,因为在header请求头函数钱不能有任何的输出。我前面有打印111,就不行了。
那我加上一个ob_start(),把输出缓存打开。代码:
神奇的发现,访问能正常打印出111222了,不报警告了。
这是为啥呢?
原因是这样的,通过ob_start()函数,开启了输出缓存,之后,echo 111,要输出的111没有直接进入程序缓存,而是被放入了ob输出缓存中,然后执行header函数的时候,这个放入的是程序缓存,之后的222,又放入了ob输出缓存。后面没有了代码,当前php代码执行完毕,ob缓存中的111和222再刷入程序缓存,这个时候,header是先于111和222在程序缓存中的,好比header在111222前面,就不会报错了。最后,程序缓存中的数据,再一起全部输出要浏览器。
OB总结
我们总结下关于ob的几个知识点
1、 在程序中,如果我们开启了ob缓存,那么页面上的输出(打印)部分数据,首先会放入ob缓存中。最后在输入程序缓存输出去浏览器。
2、我们开启ob缓存的两个方法:
1、通过php.ini,找到output_buffering选项,=Off:关闭 =On:开启 =4096:开启,并且缓存空间为4096个字节
通过配置文件开启,作用于全部php页面
2、在当前页面使用ob_start()函数开启,仅作用于当前php页面。
3、当php执行到最后,则会自动把ob缓存中的数据(如果有的话),强制刷新到程序缓存,然后通过web服务器apache等,对数据封装成http响应包,返回给浏览器。
4、如果没有ob缓存,那么要输出的所有数据直接放入程序缓存
5、header信息,不管你有没有开启ob缓存,总是被放入程序缓存
在ob中,我们常用的几个函数:
ob_start() //打开ob缓存
ob_clearn() //清除ob缓存中的内容,但是不关闭ob
ob_end_clearn() //清除ob缓存中的内容,并且关闭ob
ob_flush() //把ob缓存中的内容,刷新到程序缓存,但是不关闭ob
ob_end_flush() //把ob缓存中的内容,刷新到程序缓存,并且关闭ob
ob_get_contents() //获取ob缓存中的内容
要怎么去理解整几个函数呢,我们还是看几个例子吧!
例子1:
上面的代码页面输出是啥?111222333
文件里打印的是啥? 111222
我们逐行分析:
8:开启ob缓存,后面的输出都会被放入ob缓存
9:111放入ob缓存
10:header放入程序缓存
11:222放入ob缓存
12:此时ob缓存中有111222,被获取到$ob_str中,所以文件里打印的是111222(明白了)
14:333放入ob缓存
最后代码执行完毕,此时ob缓存中是111222333,被全部自动刷新到程序缓存,输入到浏览器
例子2:
浏览器输出:222333 最先放入缓存的111在ob_get_contents和刷新到程序缓存的时候被ob_clean清理了
文件打印:222
例子3:
浏览器输出:222333
文件打印:空 因为获取的时候,ob缓存被清空了并且关闭
例子4:
浏览器输入:报warning。 原因:111先放入ob缓存,紧接着ob_end_flush把ob中的111刷新到程序缓存,接下来header才放入程序缓存,结果造型header前有输出
文件打印:空
例子5:
浏览器输出:报错,和上例子一样
文件打印:
原因:ob没有关闭,把下面的报错信息和222都放入了ob缓存。这里大家注意到了,ob缓存的内容,不仅仅是页面的打印部分,应该是说页面最终返回到浏览器的所有内容。因为这个,我们可以用ob来做页面静态化
例子6:flush() 这个函数在手册上描述的不太准备,其实他的作用是把 ob程序缓存的内容 刷新到 浏览器缓存
上面文章开头就是用到了它。我们要知道,浏览器能看到内容,就是把程序缓存刷新到浏览器缓存的结果,一般这个过程都是在当当前代码全部执行完毕后,先把ob缓存自动刷新到程序缓存,再自动把程序缓存自动刷新到浏览器缓存,最后我们在浏览器上看到结果。
文章开头的例子中,我们使用了flush(),就可以让代码还没有执行完毕,就强制把程序缓存中的内容刷新到浏览器,直接在浏览器上可见。所以出现了1-5每秒出现一个数字的情况。
那为啥前面还加了呢?因为要让浏览器显示内容,浏览器的缓存必须达到一定的字节数,所以我们在打印1的时候,上面先放1024个空字符,保证浏览器能正常输出内容。
OB实际开发中的使用
ob的使用我简单介绍下,就是做页面静态化,一个php的动态页面,最后在浏览器显示的,肯定是一个html文件。我们利用ob缓存,可以把最终的html页面获取到,以静态文件的形式保存。之后,在页面没有更新的情况下,我们可以直接访问这个静态页面,达到网站提速的目的
转载于:https://www.cnblogs.com/zmfly/p/6635636.html
php的ob缓存详解相关推荐
- [面试专题]Web缓存详解
Web缓存详解 标签(空格分隔): 缓存 缓存之于性能优化 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度. 降低服务器压力: ...
- php的ob函数详解
php的ob函数详解 一. 相关函数简介: 1.Flush:刷新缓冲区的内容,输出. 函数格式:flush() 说明:这个函数经常使用,效率非常高. 2.ob_start :打开输出缓冲区 函数格式: ...
- MyBatis 一级缓存二级缓存详解
相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...
- Hibernate二级缓存详解(转)
Hibernate二级缓存详解(转) 本文转载 http://www.blogjava.net/supercrsky/articles/238580.html 与Session相对的是,Session ...
- vue里页面的缓存详解
关于vue里页面的缓存详解 实用的例子ABC 往下查看 keep-alive是vue内置的一个组件,可以使被它包含的组件处于保留状态,或避免被重新渲染. 用法: 在keep-alive标签内部添加 i ...
- Spring循环依赖和三级缓存详解
Spring循环依赖和三级缓存详解 Spring在启动过程中,使用到了三个map,称为三级缓存 我们可以这样理解,假设,我们只有一个缓存容器,并且缓存是直接开放给用户可以调用的,如果将未完成赋值的Be ...
- cpu二级缓存和一级缓存详解及区别(图解)
cpu二级缓存和一级缓存详解及区别(图解) 2012-09-02 12:27:55| 分类: 硬件技术 |字号 订阅 处理器缓存的传输速率确实很高,然而还不足以取代内存的地位,这主要是由于缓存只是内 ...
- Mybatis二级缓存详解
Mybatis二级缓存 Mybatis相关全览 一.简介 二.一级缓存 1.入口 2.演示 案例一: 案例二: 3.总结 三.二级缓存 1.入口 2.如何开启二级缓存 cache-ref配置 cach ...
- MyBatis 缓存详解-开启二级缓存的方法
第一步:在mybatis-config.xml 中配置了(可以不配置,默认是true): <setting name="cacheEnabled" value="t ...
- HTTP缓存详解之etag
2019独角兽企业重金招聘Python工程师标准>>> ----------------- Apache 1.3和2.x中的ETag格式为inode-size-timestamp.即 ...
最新文章
- linux find 反转 查找没有被找到的结果
- Linux下SVN服务器搭建(CentOS+Subversion)
- 无法加载可扩展计数器_多核可扩展计数器
- java隐含转化_java中自动转换和强制转换还有隐含转换
- while;do while; for循环
- MySql 学习笔记-Mysql架构介绍与查询sql执行流程
- Winform 显示Gif图片
- php---需要判断远程URL是否有效
- 守护你一生-守护线程(Java)
- 如何对接泡椒云,给你的Auto.js脚本增加卡密验证功能?详细教程
- 品牌,来1TB反向传播?
- outlook连接谷歌企业邮箱(转)
- jenkins添加从节点
- java多核_java多线程中与多核cpu有什么关系?
- mysql查询历史执行sql记录
- mac终端查看php版本_Mac切换php版本方法
- spring boot 配置多个Filter过滤器
- win7 android 双系统平板 p1000,优派Win7/Android双系统ViewPad 100
- 图片验证码显示不出来的问题
- VIPS算法对搜索引擎的意义[转载]