首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>PHP教程>资讯:php 缓存机制:输出控制

php 缓存机制:输出控制

www.jz123.cn  2013-05-29   来源:   站长家园    责任编辑(袁袁)    我要投递新闻

  1. 运行时配置(php.ini)

  output_buffering = Off

  display_errors = On

  2. 函数说明

  (1)bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

  此函数将打开输出缓冲。当输出缓冲是活跃的时候,没有输出能从脚本送出(除http标头外),相反输出的内容被存储在内部缓冲区中。内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外,使用ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

  01

  02function callback($buffer) {

  03// replace all the apples with oranges

  04return (str_replace("apples", "oranges", $buffer));

  05}

  06ob_start("callback");

  07?>

  08

  09

  10

It's like comparing apples to oranges.

 

  11

  12

  13

  14ob_end_flush();

  15?>

  16

  17输出:

  18

  19

  20

It's like comparing oranges to oranges.

 

  21

  22

  (2)string ob_get_contents ( void )

  只是得到输出缓冲区的内容,但不清除它,或者如果输出缓冲区无效将返回FALSE 。

  01

  02ob_start();

  03

  04echo "Hello ";

  05$out1 = ob_get_contents();

  06

  07echo "World";

  08$out2 = ob_get_contents();

  09

  10ob_end_clean();

  11var_dump($out1, $out2);

  12?>

  13输出:string(6) "Hello " string(11) "Hello World"

  14

  15

  16//Level 0

  17ob_start();

  18echo "Hello ";

  19

  20//Level 1

  21ob_start();

  22echo "Hello World";

  23$out2 = ob_get_contents();

  24ob_end_clean();

  25

  26//Back to level 0

  27echo "Galaxy";

  28$out1 = ob_get_contents();

  29ob_end_clean();

  30

  31//Just output

  32var_dump($out1, $out2);

  33?>

  34输出:string(12) "Hello Galaxy" string(11) "Hello World"

  (3)int ob_get_length ( void )

  返回输出缓冲区内容的长度;或者返回FALSE——如果没有起作用的缓冲区。

  1

  2ob_start();

  3echo "Hello ";

  4$len1 = ob_get_length();

  5echo $len1;

  6?>

  7输出:6

  (4)int ob_get_level ( void )

  返回嵌套的输出缓冲处理程序的级别;或者是,如果输出缓冲区不起作用,返回零。

  01

  02echo ob_get_level(); // --> 1

  03?>

  04

  05ob_end_clean();

  06echo ob_get_level(); // --> 0

  07?>

  08

  09echo ob_get_level(); // 1

  10ob_start();

  11echo "Hello ";

  12echo ob_get_level(); // 2

  13

  14ob_start();

  15echo "Hello World";

  16echo ob_get_level(); // 3

  17$out2 = ob_get_contents();

  18ob_end_clean();

  19

  20echo "Galaxy";

  21$out1 = ob_get_contents();

  22ob_end_clean();

  23echo ob_get_level(); // 1

  24

  25var_dump($out1, $out2);

  26?>

  27输出:11string(13) "Hello 2Galaxy" string(12) "Hello World3"

  (5)string ob_get_clean ( void )

  得到当前缓冲区的内容并删除当前输出缓冲区。如果输出缓冲区不是活跃的,即返回 FALSE 。

  ob_get_clean() 实质上是一起执行了 ob_get_contents() 和 ob_end_clean()。

  01

  02ob_start();

  03echo "1";

  04$content = ob_get_clean();

  05

  06ob_start(); // This is NECESSARY for the next ob_get_clean() to work as intended.

  07echo "2";

  08$content .= ob_get_clean();

  09

  10echo $content;

  11?>

  12输出: 12

  (6)bool ob_end_clean ( void )

  此函数丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在ob_end_clean()之前调用ob_get_contents(),因为当调用ob_end_clean()时缓冲区内容将被丢弃。

  返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。 错误的原因首先是,在调用时没有一个起作用的缓冲区,或者是因为某些原因缓冲区不能被删除(可能对特殊缓冲区而言)。

  错误/异常: 如果函数失败了,将引发一个E_NOTICE异常。

  (7)string ob_get_flush ( void )

  返回输出缓冲区的内容,并关闭输出缓冲区;如果没有起作用的输出缓冲区,返回FALSE 。

  01

  02//using output_buffering=On

  03print_r(ob_list_handlers());

  04

  05//save buffer in a file

  06$buffer = ob_get_flush();

  07file_put_contents('buffer.txt', $buffer);

  08

  09print_r(ob_list_handlers());

  10?> 输出: Array ( [0] => default output handler ) Array ( )

  (8)bool ob_end_flush ( void )

  这个函数将送出最顶层缓冲区的内容(如果里边有内容的话),并关闭缓冲区。如果想进一步处理缓冲区中的内容,必须在ob_end_flush()之前调用 ob_get_contents(),因为在调用ob_end_flush()后缓冲区内容被丢弃。

  注意: 这个函数与ob_get_flush()相似,不同的是ob_get_flush()会把缓冲区中的内容作为字符串返回。

  返回值:成功时返回 TRUE, 或者在失败时返回 FALSE. 错误的原因首先是,在调用时没有一个起作用的缓冲区,或者是因为某些原因缓冲区不能被删除(可能对特殊缓冲区而言)。

  错误/异常:如果函数失败了,将引发一个E_NOTICE异常。

  (9)void ob_clean ( void )

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

  此函数不会销毁输出缓冲区,而像 ob_end_clean() 函数会销毁输出缓冲区。

  (10)void ob_flush ( void )

  这个函数将送出缓冲区的内容(如果里边有内容的话)。如果想进一步处理缓冲区中的内容,必须在ob_flush()之前调用ob_get_contents() ,因为在调用ob_flush()之后缓冲区内容将被丢弃。

  此函数不会销毁输出缓冲区,而像ob_end_flush() 函数会销毁缓冲区。

  (11)void flush ( void )

  刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数将当前为止程序的所有输出发送到用户的浏览器。

  flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。

  个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。

  有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 标记之前,不会显示出整个表格。

  一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

  3.总结

  flush — 刷新输出缓冲

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

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

  ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲

  ob_flush — 冲刷出(送出)输出缓冲区中的内容

  ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓冲

  ob_get_contents — 返回输出缓冲区的内容

  ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区

  ob_get_length — 返回输出缓冲区内容的长度

  ob_get_level — 返回输出缓冲机制的嵌套级别

  ob_start — 打开输出控制缓冲


上一篇:post表单防止csrf攻击解决方案 下一篇:关于PHP的漏洞以及如何防止PHP漏洞

评论总数:0 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图