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操作……

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

oracle查看物化视图的索引,oracle – 物化视图中的域索引返回零行

我有Oracle DB的问题 – 在物化视图上通过CONTAINS()搜索后,域索引返回零行.我看到物化视图充满了数据,我还使用过程ctx_ddl.sync_index()进行域索引同步.什么有用:>创建表>插入数据>创建域索引> SYNC DOMAIN INDEX>通过包含找到行 – 返回行什么不起…

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

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

oracle活跃用户,监控数据库中的活跃用户及其运行

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼[sql] view plain copy print?set linesize 120 pagesize 66col c1 for a9col c1 heading "OS User"col c2 for a9col c2 heading "Oracle User"col b1 for a9col b1 heading "Unix PID"col b2 for…

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)

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

在linux上面找一个脚本,30个Linux Shell脚本经典案例

在学习Linux运维时,普遍反馈是:Linux Shell是一个很难的知识板块。虽然大家都认真学,基本的语法也都掌握了,但有需求时,很难直接上手编程,要么写了很久,要么写不好!也有很多做运维很…

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

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

linux 端口添加地址,linux – 绑定,网络(接口)和多播地址有什么区别?

实际上你在这里混淆了三种方法.第一个是bind,用于将套接字绑定到指定的地址和端口.使用此方法基本上您打开一个udp-port并等待该地址上的此端口的数据.第二个是join-method,用于让套接字加入指定的多播组.组播组的示例是224.0.0.1 – “所有主机”组播组 – 其针对同一网段上的…

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…

linux运维需要哪些网络知识,Linux运维学习笔记-网络技术知识体系总结

jTemplates部分语法介绍1.{#if} {#if |COND|}..{#elseif |COND|}..{#else}..{#/if} Examples: {#if 2*816} good {#else} fail {# ...解密jQuery内核 DOM操作方法(二)html,text,val回顾下几组DOM插入有关的方法 innerHTML 设置或获取位于对象起始和结束标签…

-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后端等等领域都有着优良的表现,收到了大家的广泛应用…

linux系统proc目录,快速了解Linux系统下的proc目录

/proc/devices文件这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。常用的命令为#cat /proc/devices(在调试驱动的时候这个还是有用的,可以通过lsmod查看驱动模块是否加载)/proc/interrupts这个文件的每一行都有一个保留的中断。每…