浅谈PHP中output_buffering
浅谈PHP中的output_buffering与缓存机制
在PHP开发中,缓存机制的运用广泛且重要。在PHP中,我们可以将缓存大致分为客户端缓存(Browser缓存)和服务器端缓存(Server缓存)。对于服务器端缓存,PHP自带的缓存主要分为程序缓存和OB(Output Buffering)缓存。
一、PHP的缓存种类
在服务器端的PHP脚本运行过程中,输出数据的流程会受到输出缓冲(output_buffering)的影响。当输出缓冲开启时,echo、print等输出内容会先进入OB缓存,然后再发送到浏览器进行渲染。而未开启输出缓冲时,输出内容则直接由服务器发送到浏览器。浏览器的输出缓存通常有一定的限制,如IE浏览器为256Bytes,Chrome和FireFox为1000Bytes,只有当输出数据达到这个长度或脚本结束时,浏览器才会将数据输出到页面上。
二、服务器端的响应流程
1. 客户端向服务器端发送请求响应。
2. Apache服务器加载PHP模块,开启相应的进程(或线程)运行相应的PHP脚本页面。
3. 在未开启OB缓存的情况下,脚本运行的结果会被放到程序缓存中,然后直接发送给浏览器。浏览器对页面进行渲染,生成我们看到的WEB页面。
4. 在开启了OB缓存的情况下,脚本的运行结果会被先存到OB缓存中。当程序运行到一行时,OB缓存中的数据会被刷回到程序缓存中,然后一起打包返回给浏览器。
三、OB缓存的常见用法及实例
1. 当输出数据较少时(少于一个buffer),可以设置output_buffering=4096。在这种情况下,脚本会等到所有数据都输出完毕后,才将内容发送给浏览器。
实例:
```php
for($i=0; $i<5; $i++){
echo $i.'
';
sleep(1);
}
```
因为数据未满一个buffer的大小,所以运行结果会等到所有脚本运行完毕后才输出。
2. 当禁用output_buffering,即设置output_buffering=0时,即使输出数据较少,也可以实现间歇性输出。
实例:
```php
echo str_repeat(" ",1024); //输出一个空白
for($i=0; $i<5; $i++){
echo $i."
";
flush(); //强制输出缓冲区内容
sleep(1);
}
```
因为禁用了OB,所以不需要等到脚本运行完毕就可以输出,数据没有在OB停留,可以看到断断续续间歇性输出。
3. 当输出较大数据时(大于一个buffer),如果不使用ob_start()函数开启OB,由于数据大于buffer的默认值,每当buffer满时就会输出,造成间歇性输出。
4. 当输出较大数据时且使用ob_start()时,因为为buffer设置了足够大的空间,所以数据会保存到脚本执行完毕后再输出。
深入理解并合理使用output_buffering及其他缓存机制,对于提升PHP应用的性能和用户体验具有重要意义。PHP输出缓冲机制:深入理解ob_start()与相关的函数
在PHP中,输出缓冲(Output Buffering)是一种重要的技术,它允许开发者在脚本执行期间临时存储输出的内容,直到满足特定的条件再进行输出。这一机制的关键在于ob_start()函数和其他相关函数的使用。让我们深入一下这些函数的作用和使用场景。
让我们看看e、output_buffering=On,使用ob_start()的情况。当运行以下代码时:
```php
ob_start();
echo "abc-";
header("content-type:text/html;charset=utf-8");
echo "hello-";
ob_end_flush();
echo "aa-";
echo ob_get_contents();
```
运行结果将会是:abc-hello-aa-abc-hello-aa-。这是因为ob_start()激活了输出缓冲机制,所有的输出内容被暂时存储起来,直到ob_end_flush()被调用,输出缓冲的内容才被发送到浏览器。接着,通过ob_get_contents()可以获取到缓冲区的全部内容。
接下来是f、output_buffering=Off,同样使用ob_start()的情况。运行上述代码,结果将是:abc-hello-aa-。如果在输出缓冲被关闭的状态下使用ob_start(),输出的内容将不会被缓冲,而是直接发送到浏览器。
在PHP中,输出缓冲区是可堆叠的。这意味着在一个ob_start()调用活跃的时候,你可以调用另一个ob_start()。只要确保正确调用了适当次数的ob_end_flush(),输出内容会按照嵌套的顺序通过过滤。
值得注意的是,PHP 5.2中默认输出缓冲是关闭的(output_buffering=Off),而5.3及之后的版本默认是开启的(output_buffering=On)。这是很重要的信息,因为不同的PHP版本可能会影响代码的行为。
关于常用方法的说明:
1. ob_start():激活输出缓冲机制。
2. ob_get_contents():获取PHP缓冲区的全部内容。
3. ob_end_flush()和ob_end_clean():ob_end_flush()会输出PHP缓冲区的数据但不会清空;ob_end_clean()则只会清空缓冲区中的数据而不输出。
4. ob_flush()、flush()和ob_implicit_flush():ob_flush()将刷新PHP缓冲区中的数据到程序缓存;flush()会刷新程序缓存到浏览器缓存;ob_implicit_flush()可以打开或关闭隐式刷送。
至于OB缓存的作用,它在各个方面都有应用。其中一个重要的应用是在网站准备做静态化的时候选择OB缓存。OB缓存还可以解决因响应头和响应主体位置错位导致的错误,确保响应头信息始终在响应主体内容之前。
深入理解并熟练运用输出缓冲机制以及相关函数,对于PHP开发者来说是非常有益的。希望大家能更好地理解和应用这些技术。以上就是本文的全部内容,希望大家喜欢。 (完)
Cambrian.render('body')结束。
seo排名培训
- 浅谈PHP中output_buffering
- 浅谈react受控组件与非受控组件(小结)
- 螺蛳粉读音是si还是shi
- angularjs自定义ng-model标签的属性
- jQuery实现单击按钮遮罩弹出对话框效果(1)
- 浅谈htmlentities 、htmlspecialchars、addslashes的使用方
- 使用angular框架离线你的应用(pwa指南)
- 宋亚东遭对手TKO无缘世界前五
- 芈字的正确发音是什么
- ASP ajax分页教程一
- 一吻定情2013花絮
- Validform表单验证总结篇
- 使用Node.js实现ORM的一种思路详解(图文)
- JavaScript实现AOP详解(面向切面编程,装饰者模式)
- 小心!AngularJS结合RequireJS做文件合并压缩的那些
- JavaScript正则表达式校验与递归函数实际应用实例