php中的缓,php中的缓存机制解释

php缓存的理解,先列出ob系列函数的作用:

ob_start('func') 开启php缓存,回调函数是对缓存内数据的处理函数

ob_gzhandler 作为 ob_start 的回调函数,对数据进行gz压缩

ob_implicit_flush(true/false)  打开或关闭apache缓存,打开apache缓存将直接将数据输出给用户浏览器,不必用buffer函数手动输出

flush 将apache缓存区的数据发送出去TCP到用户浏览器

ob_get_contents 获取缓存内容

ob_get_length 获取缓存内容长度

ob_get_level 返回缓存级别(每个ob_start将开启一个重0编号的缓存区)

array ob_get_status() 返回当前缓存机制的一些信息

ob_list_handlers

void    ob_flush            送出当前缓存区内容到上一缓存区并保留当前缓存区

void    ob_end_flush  送出当前缓存区内容到上一缓存区销毁(关闭)当前缓存区

string ob_get_flush  送出当前缓存区内容到上一缓存区销毁(关闭)当前缓存区 并返回缓冲区内容

void    ob_clean            清空当前缓冲区内容

void    ob_end_clean   清空当前缓冲区内容并销毁(关闭)当前缓存区

string ob_get_clean    清空当前缓冲区内容并销毁(关闭)当前缓存区 并返回当前缓存区内容

缓存的整个机制如下图所示:

0818b9ca8b590ca3270a3433284dd417.png

ob系列函数针对的都是 php bufer这块

在php buffer中,每一个ob_start都会在php buffer中开启一块内存空间,并且支持多级嵌套,嵌套关系如图

不嵌套的话 "php最终输出缓存区"就是level0 ,嵌套级别的操作都是对上级缓存空间进行的操作 (level0 的上级缓存是Apache Buffer)

flush 函数是对Apache Buffer进行的操作,刷新Apache Buffer 发送数据走TCP到用户浏览器

PHP Buffer :

在php.ini 中的选项 output_buffer 是控制php buffer的,当output_buffer = On 或者 output_buffer = number(num>0) 默认开启缓存 ob_start不能控制php buffer

当 output_buffer=0 或者 output_buffer=Off 就是关闭缓存 在脚本中需要 通过 ob_start 函数开启

output_buffer项不能通过 ini_set进行修改

Apache Buffer:

在php.ini中的选项implicit_flush= On/Off 开启的话,Apache Buffer中的数据不会缓存而是直接发送出去

ob_implicit_flush(true/ false) 可以对这个选项进行设置

开启Apache Buffer缓存后要想送出缓存中的数据需要用到函数 flush

很多时候 ob_flush flush 要结合使用:

ob_flush PHP Buffer->Apache Buffer

flush       Apache Buffer->Browser

ob_flush ob_end_flush ob_get_flush 都有送出缓存内容的操作,这时的送出缓存都是送出到上一级别的缓存区域 最后一并输出给Apache Buffer

关于PHP Buffer中的多级缓存:

每个ob_start 函数都会在PHP Buffer中开启一个缓存区域,php会将这些区域进行编号(从0开始),可以通过 ob_get_level函数获取编号

缓存嵌套的整个操作是将整个缓存进行合并最后一并发送给Apache Buffer

ob_flush函数是将当前编号内的内容送到上一编号并将php buffer中的内容发送到Apache Buffer

例子1:

ob_start();

echo "buffer1
";

ob_start();

echo "buffer2
";

ob_start();

echo "buffer3
";

ob_end_flush();

echo ob_get_level().'
';

ob_end_flush();

echo ob_get_level().'
';

ob_end_flush();

echo ob_get_level().'
';

输出内容:

buffer1

buffer2

buffer3

2

1

0

从返回的level值可看出,整个嵌套级别是从后往前的

例子二:

ob_start();

echo "buffer1
";

ob_start();

echo "buffer2
";

ob_start();

echo "buffer3
";

ob_end_clean();

ob_end_flush();

ob_end_flush();

结果:

buffer1

buffer2

不出所料,先将 2 级别缓存的内容clean掉,1 ,0 级别的内容正常输出

例子三:

ob_start();

echo "buffer1
";

ob_start();

echo "buffer2
";

ob_start();

echo "buffer3
";

ob_end_flush();

ob_end_clean();

ob_end_flush();

结果:

buffer1

从上面的例子可以总结下php缓存机制中嵌套中 整合输出的过程如下

ob_start(); echo 'buffer1' 缓存如下 0:"buffer1"

ob_start(); echo 'buffer2' 缓存如下 1:"buffer2"---->0:"buffer1"

ob_start(); echo 'buffer3' 缓存如下 2:"buffer3"---->1:"buffer2"---->0:"buffer1"

如例子一中

第一次 ob_end_flush 缓存结构 1:"buffer2buffer3"---->0:"buffer1"

第二次 ob_end_flush 缓存结构 0:"buffer1buffer2buffer3"

第三次 ob_end_flush 缓存结构 发送内容到Apache Buffer

结果:buffer1buffer2buffer3

如例子二中

ob_end_clean 缓存结构 1:"buffer2"---->0:"buffer1"

ob_end_flush 缓存结构 0:"buffer1buffer2"

ob_end_flush 缓存结构 发送内容到Apache Buffer

结果:buffer1buffer2

如例子三中

ob_end_flush 缓存结构 1:"buffer2buffer3"---->0:"buffer1"

ob_end_clean 缓存结构 0:"buffer1"

ob_end_flush 缓存结构 发送内容到Apache Buffer

结果:buffer1

以上清楚的解释了php中的缓存机制

理解了整个机制,函数的使用就简单了 Good Luck

0818b9ca8b590ca3270a3433284dd417.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 下拉菜单多选get,Jquery实现select二级联动多选下拉菜单

前言平时虽然也有写前端,但是对于一些复杂的功能实现仍是一知半解。这次项目需要实现一个多选下拉菜单,并且该菜单要和上级下拉菜单保持联动。更加麻烦的是,我需要完成以下操作,以省、市二级联动菜单为例:选择河北省 &…

idea快捷键打开run的窗口_看了上篇文章,你不了解的IDEA操作……

注意作者:卡洛小豆。换种方式写文章,写的不好请多多见谅。未经授权,禁止转载夜,结束了一天的喧嚣后安静下来,伴随着远处路灯那微弱的光。风,毫无预兆地席卷整片旷野,撩动人的思绪万千。那是一个…

arma模型_Eviews经典案例 | 初学者必看!ARMA模型精讲

【本期分析师介绍】希音老师,《数据分析学堂》金牌分析师,对eviews的时间序列、ARMA、VAR、VECM、ARCH、GARCH等操作有深入的研究和实战经验,累计服务客户1000。今天邀请希音老师给大家分享eviews的详细操作步骤。长文预警!可在文末联系麻瓜学…

c# 路径下的最近文件夹_C#8.0的两个有趣的新特性以及gRPC

最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西。今天有空,稍微写一点。下文中:关于C#语法特性的部分需要Visual Studio 2019支持。关于.NET Core的部分需要安装.NET 3.0 Preview4,低版本或许也可以但我没实…

alter table add column多个字段_ElementUI表格el-table表头固定自适应高度解决方案

一、前言ElementUI、iView都以相同的方式提供了表格组件表头固定的方法,即设置组件的height属性。表头固定很重要,就在于当表格数据项很多时,滚动条出现在表格组件内,而不是出现在表格组件外——这样的优点在于,滚动浏…

oracle ora 12011,执行oracle中的job报错:ORA-12011:无法执行作业1

LZ在做一个job执行每天新增一个表的操作时,存储过程运行没问题,job也创建成功,但运行job时,却报错: ,后又用sys用户登陆创建了同样的存储过程和job,结果可以执行成功。当时就猜测是权限问题。后…

e盘是否具有读写权限_轻松搭建MySQL主从复制、读写分离(双机热备)

主从复制: 当mysql数据库的数据量太大的时候,查询数据就很吃力了,无论怎么优化都会产生瓶颈,这时我们需要增加服务器设备来实现分布式数据库,实现多机热备份,要想实现多机的热备,首先要了解主从…

linux运维之道基础命令,Linux运维之道(7)——Linux管理类命令

(Linux)[系统管理]1. 目录管理类命令1.1 cd命令格式:cd [-L|[-P [-e]] [-]] [dir]被你忽略的小知识:在这里科普一个小小的知识点,就是关于cd -为什么可以自由的在当前目录和之前目录相互切换?其实,在我们的 Shell 的环…

html画图代码_python之matplotlib画图教程(2)

各位小表贝,你们的画图小老弟又来咯~上一次我们聊到了如何画离散图,这一次我们来点复杂的,准备好了么,系好安全带,准备发车咯~滴滴~我们先来点比较简单,那种易于上手的。如果现在我知道了两个点的坐标&…

python图像识别代码_用Python进行简单图像识别(验证码)

这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt文件中 #-*-encoding:utf-8-*- import pytesseract from PIL import Image class GetImageDate(ob…

c++ map初始化_Go学习每日一问(18)-map元素查找

每次学习并整理一个Golang的知识点,每天进步一点点。今天学习下go中的一个知识点:map元素查找日省吾身1.下面代码中 A B 两处应该怎么修改才能顺利编译?func main() { var m map[string]int //A m["a"] 1 if v : m["b&q…

-bash: wget: 未找到命令_18个堪称神器的命令行工具,高效运维必备

上期入口:24个 CSS 高级技巧合集提示:因公众号不支持超链接,上图所有项目地址,可在公众号后台回复关键字 “命令行工具” 获取。thefuck命令行打错了以后,打一个fuck就会自动纠正。GitHub:https://github.c…

linux编辑java文本,linux下的文本编辑器VI的使用命令

1、 移动光标H        #移到屏幕的左上角M         #移到屏幕的中间行开头L          #移到屏幕的最后一行[         #移到文件开始位置 (双击)]         #移到文件结束位置(双击):n         #移到文件的第n行Ctrl b     …

python3.8.0安装_Python3.8.0

Python3.8.0是一款广受程序员欢迎的编程语言,也是面向对象的一款设计语言,Python以其语言的灵活和简易性,具有非常简捷而清晰的语法特点,在脚本工具、数据分析、web后端等等领域都有着优良的表现,收到了大家的广泛应用…

cv2.error: opencv(4.4.0)_【从零学习OpenCV 4】轮廓面积与长度

本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解…

python自定义安装哪些不需要_【1】python模块:自定义模块的3种导入方式

一、定义 模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里,而如果有些功能实现起来很复杂,那么就需要创建n个.py文件,这n个.py文件的集合就是模块。如果不懂可以先看下面这篇博文&#xf…

linux划分root_vg,為Linux添加新硬盤,划分LVM分區

1、為VM添加兩塊SCSI硬盤→→完成后重啟VM→→運行fdisk -l,可以看到系統自動將添加的硬盤識別為/dev/sdb和dev/sdc.2、分區對sdb和sdc進行分區,並調整分區類型為8e(LVM類型),sdb划分為sdb1,sdb2,sdc划分為sdc1,sdc2,sdc3[rootpromote ~]# fdisk /dev/sd…

python文件输入符_python读入文件时加r的作用?

r’xxx’ 的含义 **加 r 会把字符串转变为非转义的原始字符串。**比较常用。 例如:print(D:\\test\\test.txt)print(rD:\\test\\test.txt)print(rD:\test\test.txt)123 结果是:D:\test\test.txt D:\\test\\test.txt D:\test\test.txt123 从结果看来&…

linux kvm切换器,KVM切换器是什么,看懂这一篇就够

原标题:KVM切换器是什么,看懂这一篇就够在服务器机房的机架不便于存放多个显示器和键盘的空间里,KVM切换器起着重要的作用。KVM切换器能从本地或远程监视与控制多个计算机与服务器,由键盘、鼠标和显示屏组成的KVM控制台是最方便和…

linux 信号_Linux信号量(1)-SYSTEM V

​信号量概念信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为…