【无标题】

打印 上一主题 下一主题

主题 982|帖子 982|积分 2946

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ob_get_level函数用于获取当前输出缓冲区的嵌套级别‌。如果输出缓冲区未启用,则返回0;如果启用了输出缓冲区,则返回当前的嵌套级别‌12。
输出缓冲区的嵌套级别

输出缓冲区处置惩罚函数的作用类似于堆栈,用于临时存储输出内容,处置惩罚后再输出。每次调用ob_start()都会开启一个新的缓存区,相当于增加一层嵌套。例如:


  • ob_start(); 开启第一个缓存区,嵌套级别为1。
  • ob_start(); 开启第二个缓存区,嵌套级别为2。
  • ob_start(); 开启第三个缓存区,嵌套级别为3。
通过调用ob_get_level()可以获取当前的嵌套级别。例如:


  • 在第一个ob_start()后调用ob_get_level()会返回1。
  • 在第二个ob_start()后调用ob_get_level()会返回2。
  • 在第三个ob_start()后调用ob_get_level()会返回3‌12。
输出缓冲区的配置和使用场景

在php.ini配置文件中,可以通过设置output_buffering来启用或禁用输出缓冲区。默认值为4096字节。当输出缓冲区启用时,输出的顺序为:PHP输出缓冲 -> 服务器缓冲 -> 浏览器缓冲 -> 浏览器表现。如果未启用输出缓冲区,输出的顺序则为:服务器缓冲 -> 浏览器缓冲 -> 浏览器表现‌12。
通过使用输出缓冲控制函数,如ob_start(), ob_get_contents(), ob_end_clean(), 和 ob_end_flush(),可以实现对输出的灵活控制。
php.ini中配置缓冲

在php的配置文件php.ini中有以下这项配置 output_buffering ,php.ini默认设置了output_buffering = 4096,php已经设置了一个缓冲区。
如果php.ini 中打开了此项: echo,print 后的输出顺序就是-> php output_buffring -> server buffering -> browser buffering -> browser display;
如果未打开php输出缓存: echo,print 后的输出顺序就是-> server buffering -> browser buffering -> browser display.
   如果 php.ini 开启了缓存,则 ob_get_level() 得到的值会是1,相当于都实行了一次ob_start(),配置output_buffering = 0,嵌套级别的值会为0。
  如果总是渴望在脚本的开头有一个输出缓冲区,则可以使用
  1. if (!ob_get_level()) ob_start();
复制代码
  在脚本的开头这样写,相当于可以关闭 php.ini 中设置的缓存区
  缓存嵌套级别的理解

输出缓冲区处置惩罚函数的作用有点类似堆栈,临时放入一个存储空间中,对内容举行处置惩罚。类似队列一样,但是不是先辈先出,而是先开后关,缓存区关闭的顺序是从下到上
ob_start() 每实行一次,就会开启一个新的缓存区。
先看个例子:
  1. // php.ini中开启了缓存区,相当于都已执行一次 ob_start() (理解名为 buffer_A 区块)
  2. echo '(buffer_A)'; //缓存 buffer_A 区 保存了下面的所有输出
  3. echo ob_get_level();         #输出1
  4. ob_start();                #开启一个缓存区(理解名为 buffer_B 区块)
  5. echo '(buffer_B)'; //缓存 buffer_B 区 保存了下面的所有输出(不包括A区的内容)
  6. echo ob_get_level();         #输出2
  7. ob_start();                #开启一个缓存区(理解名为 buffer_C 区块)
  8. echo '(buffer_C)'; //缓存 buffer_C 区 保存了下面的所有输出(不包括 A&B 区的内容)
  9. echo ob_get_level();        #输出3
  10. echo "<br>---------------------<br>";
  11. //第1次获取输出缓存区的内容是最后一个缓冲区的内容:输出  buffer_C 区范围下的内容
  12. //echo ob_get_contents(); # 输出 3(buffer_C)
  13. //第1次关闭的缓冲区是最后一个缓存区:buffer_C
  14. ob_end_flush();                #关闭缓存区(buffer_C )
  15. //关闭1个缓存区后,第二次获取缓存区的内容:输出的是 buffer_B 区 范围下的内容,
  16. //echo ob_get_contents(); # 输出 2(buffer_B)3(buffer_C)
  17. //第2次关闭的缓冲区:buffer_B
  18. ob_end_flush();
  19. //关闭2个缓存区后,第三次获取缓存区的内容:输出的是 buffer_A 区 范围下的内容,
  20. //echo ob_get_contents();  # 输出 (buffer_A)1(buffer_B)2(buffer_C)3
  21. //第3次关闭的缓冲区:buffer_A,此时所有的缓冲区都被清了
  22. ob_end_flush();
  23. echo ob_get_contents(); # 没有内容输出
复制代码
通过 ob_get_contents() 每次获取到的缓存区的内容可得到,每个缓冲区保存的内容都是在他下面范围的内容。
这个“下面”怎么理解,如例中:buffer_A 区保存A,B,C 这3区的内容,buffer_B 区保存的是B,C 这2区的内容,buffer_C 区保存的是 C 这1区的内容。
而 ob_end_flush()每次关闭都是后面的缓冲区,关闭的顺序是从下到上的关闭,也是先开后关,后开先关,就如列队一样,start 开启时是按照顺序开启,关闭时是从队伍后面开始关闭。
如例子,开始关闭的是 C区,然后 B 区,末了 A 区 。(start开启缓冲区是进队:A,B,C ,end关闭缓存区是出队: C,B,A)
   理解好每个缓存区保存的是“所属下面的内容”,第一次开启的缓存区是最顶级的,下面全部子级的内容都在上游的缓存区中。
  理解要点

  1. 1、所有缓冲区控制是在一个PHP执行进程中发生的。如:你打开n个demo.php,他们之间开启和关闭缓冲是互不影响的。
  2. 2、output_buffering在程序中用ini_set是不能生效的。
  3. 3、所有缓冲区数据,如果没有手工flush刷出,则在程序结束会被解释器刷出。
  4. 4、关于嵌套级别:当顺序开启多个ob_start()时,会相应开启多个缓冲区。可以理解成队列,队伍成员是ob_start()开启的缓冲区块,而ob_get_level()可理解成当前队伍最末尾的缓冲块的序列号。
  5. 5、每次echo,print输出的内容都是针对队尾的缓冲区块进行的。
  6. 6、每次ob[end][flush|clean]函数也都是针对队尾缓冲区块进行的。
  7. 7、每次执行flush刷出,都是由位于队尾缓冲区块向上一级缓冲区块刷出,且区块里的内容不是替换,而是叠加。
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表