出口缓冲,php中ob函数缓冲机制深入驾驭

后天有亟待用到验证码,就敲了个,毕竟用途相比广,所以打算把代码留下来,今后一定用得上的。当然,今日在做的时候也是有一些标题标,分享出去啊,记录本身所犯的荒谬,幸免以往再掉坑里。

firefox错误码:

上边就php中ob函数缓冲机制通过文字表达加代码分析的样式给大家浮现如下:

来自: 
在PHP编程中,  大家日常会蒙受有个别一贯爆发输出的函数,  如passthru(),readfile(),  var_dump()  等.  但有时大家想把这么些函数的出口导入到文件中,或然先通过处理再出口,  可能把那么些函数的出口作为字符串来处理.   
那时候大家将要用到  Output  Buffer(输出缓冲)  函数了.   

先给个效益图(下边的真的是图):

故事情节编码错误

对此三个刚刚入门的php程序员来说,php缓冲区是大约透明的。在她们内心中,多少个echo
print_r
函数
,数据便会‘嗖’的一声飞到浏览器上,彰显出来。笔者也直接那样单纯地以为。
其实,在技能的世界里,一贯都以由简单到复杂,恐怕那个技术开发者开端独自如你自身,不过面对暴虐的切实,不得不调整政策,以期进步机器运维成效,最终想到了那多少个让大家陈赞的idea。

拍卖输出缓冲的函数紧要有诸如此类多少个:   
ob_start()  初阶出口缓冲,  那时PHP截止输出,  在那未来的输出都被转到3个内部的缓冲里.   

www.5929.com 1

出口缓冲,php中ob函数缓冲机制深入驾驭。没辙突显你尝试查看的页面,因为它利用了没用只怕不扶助的压缩格式。

  说到缓冲,相当于buffer,那里不可不要和缓存做一下比较,单纯地比较定义是空洞的,莫不如看看它们做什么。缓存化解的是什么样高效搜索利用多少,节省cpu消耗难题,而缓冲消除的是神速cpu与低速I/O设备不般配的难题。

ob_get_contents()  这些函数重临内部缓冲的内容.  那就等于把那么些输出都变成了字符串.   

再上完整的代码吧:

请联系网站的主人以告知此题材

  再说下本文的另一个支柱,ob函数,ob是output_buffering的简写。既然ob函数是php扩充函数,那么ob函数紧要操作的约等于php
buffer
了。

ob_get_  length()  重返内部缓冲的长度.   

 1 <?php
 2     // 开启 session
 3     session_start();
 4     
 5     // 丢弃输出缓冲区的内容 **
 6     ob_clean();
 7     
 8     // 1 创建画布
 9     $img = imagecreatetruecolor(100, 30);
10     
11     // 2 画一个矩形并填充
12     $bgcolor = imagecolorallocate($img, mt_rand(120,255), mt_rand(120,255), mt_rand(120,255));
13     imagefilledrectangle($img, 0, 0, 100, 30, $bgcolor);
14     
15     // 3 在画布上进行操作
16     
17     // 3.1 定义字符串
18     $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
19     
20     // 3.2 定义变量,存放验证码
21     $code = '';
22     
23     // 3.2 加载自定义字体
24     $font_file = './comic.ttf';
25     
26     // 3.3 生成文字部分
27     for ($i = 0; $i < 4; $i++) {
28         // 定义字体颜色
29         $fontcolor = imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
30         
31         // 文字内容
32         $content = substr($str, mt_rand(0, strlen($str)-1), 1);
33         
34         // 设置显示坐标
35         $x = ($i * 100 / 4) + mt_rand(5, 10);
36         $y = mt_rand(17, 22);
37         
38         // 把文字填充到画布
39         imagefttext($img, 15, mt_rand(-5, 5), $x, $y, $fontcolor, $font_file, $content);
40         
41         // 将文字内容赋值给 code 变量
42         $code .= $content;
43     }
44     
45     // 3.4 将大写字母转换为小写
46     $code = strtolower($code);
47     
48     // 3.5 给 session 赋值
49     $_SESSION['code'] = $code;
50     
51     // 3.6 设置干扰元素
52     for ($i = 0; $i < 200; $i++) {
53         $pointcolor = imagecolorallocate($img, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
54         imagesetpixel($img, mt_rand(1, 99), mt_rand(1, 29), $pointcolor);
55     }
56     
57     // 3.7 设置干扰线
58     for ($i = 0; $i < 3; $i++) {
59         $linecolor = imagecolorallocate($img, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
60         imageline($img, mt_rand(1, 99), mt_rand(1, 29), mt_rand(1, 99), mt_rand(1, 29), $pointcolor);
61     }
62     
63     // 4 向浏览器输出图片头信息
64     header('Content-Type:image/png');
65     
66     // 5 输出图片到浏览器
67     imagepng($img);
68     
69     // 6 销毁图片
70     imagedestroy($img);
71 ?>

 
出口缓冲,php中ob函数缓冲机制深入驾驭。破绽百出原因和平解决决办法:

  不难说完本文多少个主演,我们还必须回归起初的核心,echo
print_r
函数输出的数码是怎么到达浏览器让用户旁观的呢?实际上的历程是这么的:

ob_end_flush()  截止输出缓冲,  并出口缓冲里的内容.  在那事后的输出都以常规输出.   

相遇的多个比较严重的题材,约等于自家没能独立消除的,就是 ob_clean()
那里(注释上加了俩 *
呢),最初是没有那行代码的。当然,现象就是怎么都刷不出图,看了手册也没找到解决办法,最终依旧凭借了度娘,找到了下边的化解办法。(万能的度娘,请收下自个儿的膝盖)

壹 、保险php程序没有其他警示或出错的提示

复制代码 代码如下:

ob_end_clean()  截至输出缓冲,  并扔掉缓冲里的内容.   

自小编感觉注释依然比较详细的呢,反正小编看得懂(马虎粗心)。

2、PHP代码ob_start(‘ob_gzhandler’)导致的,导致的来头有二种:
     
a、服务器不扶助那种压缩格式,可应用function_exists(‘ob_gzhandler’)判断,消除办法
ob_start(‘ob_gzhandler’)改为ob_start();
     
b、使用ob_start(‘ob_gzhandler’)时候前边已经有内容输出,检查前面内容以及require
include调用文件的始末。若不可以找到可以在调用其余文件前应用ob_start(),调用之后拔取ob_end_clean () 来解除输出的始末;

echo、print_r=>php output_buffering=>webServer
buffer=>browser buffer=>browser display

举个例证,  var_dump()函数输出1个变量的协会和内容,  那在调试的时候很有用.   
但要是变量的始末里有  <  ,  >  等HTML的特殊字符,  输出到网页里就看不见了.  咋做吧?   
用输出缓冲函数能很不难的消除那几个难点.   

当然,ob_clean()
并无法缓解全数的不能突显的题材,具体难题具体分析,视本身的图景而定。

3、set_magic_quotes_runtime()函数:
提示:Function set_magic_quotes_runtime() is
deprecated,导致那几个提醒的由来是在PHP5.3后此天性已经关闭,在PHP6中早已完全移除此本性,相当于这么些函数已经不设有了。你可以注释
恐怕去除掉出错的行,恐怕是在set_magic_quotes_runtime()前面加@符号。

  大家可以领悟地看来,从echo、print_r函数到发送新闻给客户端经历了多少个缓冲区,在客户端还经历了1个浏览器缓冲区。大家本文首要切磋的是php
output_buffering

ob_start();   
var_dump($var);   
$out  =  ob_get_contents();   
ob_end_clean();   

四 、PHP5.30版本,默许不再支 持那样的语法,输出变量需使用php echo
$username;?>语法才得以。你可以经过将 php.ini 中的 short_open_tag
设置为 On,以协作原来的语法。

  未利用ob函数时缓冲区的拔取情形

这时var_dump()的输出已经存在  $out  里了.  你可以明天就输出:   

php关于ob_start(‘ob_gzhandler’)启用GZIP压缩的bug

   大家的代码很多时候是根本不接纳ob函数的,那么它们选拔缓冲区了吗?这要看php设置情状。缓冲区是经过php.ini中的output_buffering变量控制的。其暗中同意值是off,可以安装为on来开辟buffer。打来buffer后,即使程序中并未用ob函数,实际上代码也是运用了缓冲区的。此外,不管php.ini中output_buffering的安装,cli形式下的php始终私自认同是关闭的。

echo  ‘<pre>’  .  htmlspecialchars($out)  .  ‘</pre>’  ;   

即便使用ob_start(“ob_gzhandler”);
则ob_clean()前面的输出将不出示,那是个bug,
可以用ob_end_clean();ob_start(“ob_gzhandler”); 代替ob_clean();
不然后边输出内容将是空。
<?php
error_reporting(E_ALL);
ob_start(“ob_gzhandler”);
echo “content”;
ob_clean();
echo “more content”;
?>
地点的代码期望输出more content实际上什么内容也不会输出。

  为啥假如缓冲区呢?简单的说,高速的cpu早早处理完自个儿的多寡,想经过线路传递给用户,不过线路太窄了,一下输送但是去。如果引入缓冲区,cpu可以将飞快将扭转的数目放入缓冲区,然后自个儿哪个地方凉快儿哪个地方呆着这歇着去了。缓冲区依照指令适时将数据输出。这一个样就创造化解了高速cpu与低速I/O设备的争执了。 

依然等到未来,  再大概把这些字符串送到模板(Template)里再输出.  

上边就见惯司空了
<?php
error_reporting(E_ALL);
ob_start(“ob_gzhandler”);
echo “content”;
ob_end_clean();
ob_start(“ob_gzhandler”);
echo “more content”;
?>

  缓冲区的多少什么日期输出呢?1,当缓冲区满了的时候,缓冲是有体量大小的,到达终点则会自行输出内容。2,脚本执行完成。很多小程序输出内容没那么多,总不只怕等到缓冲区满了再出口吧~这点再自然但是。

你或然感兴趣的篇章:

  • php使用ob_start()落成图片存入变量的法门
  • PHP使用ob_start生成html页面的措施
  • php缓冲
    output_buffering和ob_start使用介绍
  • 用php的ob_start来变化静态页面的格局分析
  • 用PHP
    ob_start()控制浏览器cache、生成html落成代码
  • php读取远程gzip压缩网页的主意
  • 利用php判断网页是不是gzip压缩
  • PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
  • php中ob函数缓冲机制长远通晓
  • php中ob_get_length缓冲与收获缓冲长度实例
  • php
    ob_flush,flush在ie中缓冲无效的化解办法
  • php基于ob_start(ob_gzhandler)完结网页压缩作用的措施

下边自定义1个回调函数再测试
<?php
function my_ob_gzhandler($buffer,$mod){
   header(“Content-Encoding: gzip”);
   return gzencode($buffer, 9, FORCE_GZIP);
}

  接纳ob函数时缓冲区的选用状态

error_reporting(E_ALL);
ob_start(“my_ob_gzhandler”);
echo “content”;
ob_clean();
echo “more content”;
?>
地点是正规的,但拔取ob_end_clean代替ob_clean后又会导致前面的输出不会显得。

复制代码 代码如下:

为此即便是底下的代码依然会在行使ob_clean或者ob_end_clean后会导致出口为空。
<?php
if (ini_get(‘zlib.output_compression’)) {
   if (ini_get(‘zlib.output_compression_level’) != 9) {
      ini_set(‘zlib.output_compression_level’, ‘9’);
   }
   ob_start();
} else {
   if (strstr($_SERVER[‘HTTP_ACCEPT_ENCODING’], “gzip”)) {
      ob_start(“ob_gzhandler”);
   } else {
      ob_start();
   }
}
?>

 ob_start()

最平稳的启用页面压缩的点子应该接近下边
<?php
if(extension_loaded(‘zlib’)) {
ini_set(‘zlib.output_compression’, ‘On’);
ini_set(‘zlib.output_compression_level’, ‘3’);
www.5929.com,}
?>

  打开输出缓冲。那么些函数是我们调用最多的三个函数之一。在output_buffering设置为on或许x
k的气象下,那么些函数与其说是打开输出缓冲,还不如说将出口缓冲伸张到很大。当然在output_buffering设置为off的条件下,ob_start会起到打开buffer的功用。ob_start()还能传递1个可选参数
output_callback 函数,php官方手册有详细表达。

但只要一定要使用ob_gzhandler来启用页面压缩就要专注本文的首先句话了。

复制代码 代码如下:

骨子里,上面的代码只是浏览器不显得
error_reporting(E_ALL);
ob_start(“ob_gzhandler”);
echo “content”;
ob_clean();
echo “more content”;

ob_get_contents()

但就算测试一下

  只是收获输出缓冲区的内容,但不排除它。

telnet localhost 80
GET /test.php HTTP/1.0
<Enter>
<Enter>

复制代码 代码如下:

将会重临如下消息

ob_end_clean()与ob_clean()

HTTP/1.1 200 OK
Date: Fri, 20 Feb 2009 15:40:17 GMT
Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Vary: Accept-Encoding
Content-Length: 12
Connection: close
Content-Type: text/html

  这八个函数从字面意思上就可以看来其分别。前者清除缓冲区内容还要关闭,后者仅仅是做扫除工作。需求专注的是,使用了这三个函数,在前面使用了echo、print_r等函数不会输出内容。

more content

  作者曾经计算透过print_r打印出ob_get_contents()的故事情节,然后调用ob_clean()铲除缓冲区,以防影响后边对缓冲区的操作,屡屡战败。仔细探讨,print_r的故事情节再度写入缓冲区,而前边做了ob_clean()的操作,自然不会有其他输出。在ob_clean操作此前调用ob_flush()函数便可达到预期的效率。

错过了跟主机的连天。

复制代码 代码如下:

可以见见more content已经出口

ob_flush()与flush()

 

  ob_flush()送出缓冲区的始末还要废弃内容。由此在此函数从前最好应用ob_get_contents()拿到缓冲区内容。flush()刷出服务器端缓冲,并且发往客户端。由此从流程上的话,应该是先调用ob_flush()而后再调用flush函数。

  其余表明下再Apache buffer flush()的干活原理:在apache
module
的sapi下,flush会通过调用sapi_module()的flush成员函数指针,直接使用apache的api::ap_rflush刷新apache的输出缓冲区。当然apache其余模块比如mod_gzip或是更改这一个动作的结果,大概自个儿开展输出缓冲区,那将招致flush()函数发生的结果不会应声被送到客户端浏览器。

复制代码 代码如下:

ob_get_clean()

  若是您早就熟知了然ob_get_contents()ob_clean(),这这几个函数就很粗略了。因为它是前两者的结合体。它非常重即使赢得当前缓冲区的情节并删除当前出口缓冲区。

  ob函数还有很多,但多数用法比较简单,了然比较不难。我们可以参考php手册
,里面会有详实的表明。本文列出了作者开端并不是很领悟的有个别函数,当然现在还会有新的难点应运而生,想到难题还要化解难点,生活的乐趣或许就在此地吧。

上述内容就是本文针对php中ob函数缓冲机制深切精通,希望对大家随后求学抱有支持。

您只怕感兴趣的篇章:

  • php使用ob_start()已毕图片存入变量的章程
  • PHP使用ob_start生成html页面的艺术
  • php缓冲
    output_buffering和ob_start使用介绍
  • 用php的ob_start来扭转静态页面的方法分析
  • 用PHP
    ob_start()控制浏览器cache、生成html完毕代码
  • php读取远程gzip压缩网页的法门
  • 采用php判断网页是还是不是gzip压缩
  • PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
  • php中ob_get_length缓冲与收获缓冲长度实例
  • php
    ob_flush,flush在ie中缓冲无效的缓解方法
  • php中ob(Output Buffer
    输出缓冲)函数使用形式
  • php基于ob_start(ob_gzhandler)落成网页压缩功效的艺术

Leave a Comment.