php怎么清除缓冲区?

php清除缓冲区的方法:1、使用“ob_clean()”函数清除,该函数可以清除php缓冲区里面的内容;2、使用“ob_end_clean()”函数清除,该函数清除php缓冲区内的内容,并且关闭输出缓冲区。

php怎么清除缓冲区?

推荐:《PHP视频教程》

php清除y Y s p ; $ q缓冲区的方法

方法1:ob_end_clean

ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲

语法:

ob_end_clean ( void ) : bool

此函数丢弃最顶层输出缓冲# { . 3 _ v ?区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在ob_end_clean()之前调用ob_ged o 3 E B { dt_contents(),因为当调用ob_end_clean()时缓冲区内容将被丢弃。

返回值

成功时返回 TRUE, 或者在失败时a c `返回 FALSE。 错误的原因首先是,在n m j调用时没有一个起作用的缓冲区,或者是因为某些原因缓冲区不能被删除(可能对特殊缓冲区而言)F o 9 M n ` R p :

方法2:使用ob_clean()

ob_clean — 清空(擦掉)输出缓冲区

说明

ob_clean ( void ) : void

此函数用来丢弃输出缓冲区中的内容。

此函数不会像 ob_end_clea* { 9 p o $ _ nn() 函数那样销毁输出缓冲区。

输出缓冲必须已被 ob_stF 7 y Q g F Qart() 以 PHP_OUTPUT_HANDLER_a H x @ aCLEANABLE 标记启动。否则 ob_clean(4 } 7) 不会有效果。

返回值

没有返回值。

扩展知识

什么是缓冲区D u ! Y(buffer)?

简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网上找下资料.

其实缓冲区最本; } 3 J , ~ : 8质的作用就是,协调高速CPU和^ Z ~ = # : = @ 7相对缓慢的IO设备(磁盘等)的运作.

PHP在执行的时候,在什么地方有用到缓j g W o冲区?

想要了解PHP的缓冲区0 m & [ /,就要知道H O - 5 B - ( _执行PHk o ~ Z ! ` m KP的时候,缓冲区被设置到了什么地方.

当执行PHP的时候,如果碰到了echo print_r之类的会输出数据的代码,PHP就会将要输出的数据放m q 5 Z K到PHP自身] B h [的缓冲区,等待输出.

当PHP自身的缓冲区接到指令,指示要输出缓冲区的内容时,将会把缓冲区= f n h E t内的数据输出到apache上, apache接受到Pu m B , I W q KHP输出的数据,然后再把该数据存在到apache自身的缓冲区内,等到输出

当apache接受到指令,只是要输出x ) v缓冲区的* 9 .内容时, 将会把缓冲区的内容输出,返回到浏览器.

步骤:执行php---->(碰到echo,print_r之类输出)将B Q ] a a a N输出的数据放到php自身的缓冲区,等待输出---->(接收输出缓冲区内容)数据输出到apaA & y x l Jche上,存# w M n F S入apache自身的缓冲区---->(接收输出指定)缓冲区内容输出,返回到浏览器1 # G C f A ;

echo? ] N Q 5、print => phpU y o B W b output_buc F m )ffering => webServer buffer =>a & / x % browser buff => browser display

即:脚本输出 => php的缓冲区设置 =&H 2 ! b z { (gt; 系统的缓冲区设置(apache、nginx) => 浏览器的缓冲区设置 => 显示给用户

由此可见,PHP要输出数据的时候,将会经过两个缓冲区(先是自身的9 f 8 b a _,然后是apache的),再返回到浏览器.

缓冲区在PHP中起到什么作用?

1、最常见的就是在使用header函数v v & ; 0 = G之前,就已经输出了某些数据,这样会导致某些错误,例如 Cannot modify header information – headers al| 6 u dready sent by;

echo "this is test";
header("LOCATION http://www.baidu.com");

出现这个错误的原因是, 在heL 1 W 8 P G w l pader之前已P p * ! S C 1 y经输出了某些数据,而输出这些数据的同时, apache将会同时发送一个响应状态到浏览器上(既然有输出,即这个请! . . n R 1 ] u M求是有效的),而其后你又再次使用header函数

发送http头,则会返回这个错误,错误的意思是:HTTP头已经发送出去了,/ c w j h e你不能对他再做修改.

为什么使用缓冲区可以避免这个错误呢?

因为header函数是不受缓冲区影响的,当一碰到headerF C o E s . o函数的时候,PHP马上执行apu R ! Lache发送这一个http头都浏览器.

而输出的数据PHP打开输出缓冲区后, 这些数据将会s n ; / * h M h存放在缓冲区,等待输出.这样就可以避免了之前所发生的错误.

2、通过PHP写文件下K M 0 b载程序的时候.((实例篇)PHP实现HTTP断点续传的方法的原理)

为了让文件下载更安全,同时提高更多的可控性,很多朋友都喜欢用PHPh 7 g ~ P m , 3写文件下载页面.其原理很简单,就是通过fwrite把文件内容读出并显( X 2 # z s示,然后通过header来发送HTTP头,让浏览器知道这是一个附件,这样就可以达到~ S ?提供下载的效果.

如果用上面) _ o的办法提供下载页面,会碰到一个效率问题,如果一个文件很大,假设为100M,那么在不开启缓冲区V P y输出的情况下,必须要把100M数据全部读出,然后一次返回到页面上,如果这样做,用户将会在所有数据读完之后才会得到响应,降低了用户体验感.

如果开启了输出缓冲区,当PHP程序读完文件的某一段,然后马上输出到apache,然后让apache马上返回到浏览器,这样就可以减少用户等~ H ( % y待时间.那后面的数据怎么办呢?我们可以写一个_ 8 ? L i ,while循环,一直一段一段地读取文件每读一段,就马上输出,直到把文件全部输出为止,这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕. 另外,该做法/ ` | ? u c还解决了另外一个很严重的问题.例如一个文件是100M,如果不开启缓冲区的情况下,则需要把100M文件全部读入内存,然后再输出.但是,如果PHP程序做了内存限制呢?为了保证服务i 9 & h }器的稳定,管理员通常会把PHP的执行

内存设一个限制(通过php.ini总的memory_liml u ) $ ; O +it, 其默认值是8M),V v w [ d d 也就是每个PHP程序使用的内存不能使用超过这个值的内存. 假设该值为8M,而要读入的{ 2 I b y h / T文件是100M,根本就没有足够的内存来读入该文件.这个时候,我们就需要用到上面的2 Q ( 2

办法来解决这个问题,每次E 0 % r l只读某一段,这样就可以避, m T { 2免了内存的限制

3、静态文件缓存

现在很多公司有这么一个需求, 就是某一个页& { e ( T ? 9面在第一次访问的时候,会执行PHJ $ 1 % O I o UP,然后把显示的内容返回到浏览器,同时需要把这次显示的内容保存到服务器上,这3 v |样下次访问的时候,就直接把$ Z 1 Z x b E保存在服务器上的文件直接显c m l /示,而不需要通过PHPo & 5 ] O v来做操作这就是所谓的”静态页面缓存”.那怎么样才能做到把内容返回到浏览器的同时把数据保存T c E到服务器上呢?这就要用到输出缓冲区了.

ob_start();
echo 'aaa';
$string = ob? t 7 ( . J 5 1_get_cB : I q n O *ontents();
file_put_contents('a.html', $string);
ob_F : 6 Qflus: x c Eh();
flush();

与输出缓Z x e j W = B k冲区有关的配置

b W t [ U f S y `PHP.INI中,有两个跟缓冲区紧密相关的配置项

1.output_bufh 1 [ n | e ufering

该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值)n S T R & } ~;

  • on -p ! / i B ( 6 x 开启缓冲区

  • off - 关闭缓冲区

256k - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区g 7 + 8 [ A 5 q $(把数据发送到apache);

2.implicit_flush

该配置直接影响apache的缓冲区,有2种配置参数. on/off

  • on -{ z # : c ~ 4 D 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等S ; g待其他指令,直接就把输出2 - h z l返回D e z g 到浏览器

  • off - 不自动刷新apO U X j 1 c M J #ac{ g M Whe缓冲区,接受到数据后,等待刷新指令

与缓冲区有关的函数

1.ob_imD ( V x T Y l h kplicit_flush

作用和implicit_flush一样,是否自动刷新apache的缓冲区

2.flush

作用是发送指令到apacheJ o J E e T,让apacj Z Ehe刷新自身的输出缓冲区.

3.oU u } V # o h Wb_start

打开输出缓冲区,无论php.ini的文件如何配置,如果使用该函数,即使output_buffering设置成off,也会打开输出缓冲区

ob_start函数还接受一个参数,该参数是一个函数的回调,意思是,在输入缓冲区内容之前,需要使用调用传递进来的参e 6 ]数把缓L B h冲区的内容处理一次,再放入缓冲区内

4.ob_flush

指示php本身刷新自身的缓冲区,把^ L y Y . v A ) j数据发送到apache

5.ob_clean

清除{ 2 _ c x N K Uph2 $ 5 I 5 H ? Ep缓冲区里面的内容

6.ob_end_clean

清除php缓冲区内B N 9 ) s的内容,并且关闭输出缓冲区

7.ob_end_flush

把php自身的缓冲区里的内容发送到apache,并把清除自身缓冲区内的内I h , o n $ C

8.ob_get_clean

获取缓冲区的内容之后,清除缓C F e t r 4 E 4 r冲区.

9.ob_get_conr $ ( [ t F Itents

获取输出缓冲区里的内容

10.ob_get_flush

获取缓冲区里的内容,并且) ; + z把这些内容| ; @ ~发送到apache

11.ob_get_length

获取缓冲区里内容的长度

12.ob_list_handlers

获取运q X i _行ob_start时,所回调的函数名称, 例如:

ob_start(‘ob_gzhandler’);

print_r(ob_list_handlers);

将打印出ob_% @ = f z L U M ygzhandler;

13.ob_gzhandler

该函数的作用是作为ob_start的回调参数, 在缓冲区刷新之前,会调用该函数对数据进行到底gzip或者deflate压缩.这个函数需要zlib扩展的支持.

以上就是php怎么S x 8 % a F 清除缓冲区?的详细内容。