php缓冲 output_buffering的使用详解
PHP输出缓冲分析:深入理解output_buffering机制
在Linux系统中,buffer作为一个内存地址空间,主要用于不同速度或优先级的设备间数据传输。当我们在PHP中执行echo或print命令时,数据首先被写入php buffer。这里的buffer机制指的是在tcp buffer之前建立的一个新队列,数据必须首先经过这个队列。当php buffer填满后,脚本会将数据交给系统内核,再通过tcp发送给浏览器显示。
一、PHP output_buffering概述
在默认情况下,php buffer是开启的,其默认值为4096(即4kb)。你可以在phpi配置文件中找到output_buffering配置。当使用echo, print等命令输出数据时,这些数据首先会被写入到php output_buffering中。当buffer填满后,数据才会通过tcp传送至浏览器。你也可以通过ob_start()手动激活output_buffering机制,这样即使输出数据超过4kb,也不会立即发送至浏览器,直到脚本结束或调用ob_end_flush函数,数据才会被发送给客户端浏览器。
二、output_buffering的不同设置对输出的影响
1. 当output_buffering设置为4096且输出数据量较少时:
代码示例:
```php
for ($i = 0; $i < 10; $i++) {
echo $i . '
';
sleep($i + 1); // 模拟延迟处理
}
```
现象:在这种情况下,你不会看到间断性的输出。相反,浏览器界面会保持空白,直到服务器脚本处理结束,输出内容才会一次性显示。这是因为数据量太小,没有达到php output_buffering的阈值。数据的流动路径是:echo -> php buffer -> tcp buffer -> browser。
2. 当output_buffering设置为0且输出数据量较少时:
代码示例:
```php
// 通过ini_set('output_buffering', 0)并不生效,应编辑/etc/phpi来设置output_buffering=0以禁用output buffering机制。
ini_set('output_buffering', 0); // 禁用output buffering功能
for ($i = 0; $i < 10; $i++) {
echo $i . '
';
flush(); // 通知操作系统底层尽快发送数据给客户端浏览器
sleep($i + 1); // 模拟延迟处理
}
```
现象:禁用php buffering机制后,你会在浏览器中看到间断性的输出,而不需要等待脚本完全执行完毕。这是因为数据没有在php output_buffering中停留。这种设置对于需要实时反馈的Web应用特别有用。
数据的流转旅程始于echo,穿越tcp buffer,最终抵达浏览器。当output_buffering设定为4096时,我们深入一下数据输出的过程。
设想一个场景,输出数据超过了一个buffer的大小,且没有调用ob_start()。我们创建一个仅4kb大小的文件,然后逐步通过PHP循环输出其内容。在这过程中,你会观察到间断性的输出,浏览器界面不会一直保持空白。尽管启用了php output_buffering机制,但由于空间不足,每填满一个php buffering,数据就会被发送到客户端浏览器。
当我们在输出数据大于一个tcp buffer时,并调用了ob_start()。php buffer被扩展到足够大,直至ob_end_flush函数调用或脚本执行结束,才会将php buffer中的数据发送到客户端浏览器。浏览器在等待服务端数据的过程中,一直保持着空白界面。
深入理解output buffering机制中的几个关键函数:
1. ob_get_level:这个函数返回输出缓冲机制的嵌套级别,有助于防止模板重复嵌套。
2. ob_start:这个函数激活了output_buffering机制。一旦激活,脚本的输出不再直接发送到浏览器,而是暂时存储在php buffer内存中。默认情况下,php是开启output_buffering机制的,但可以通过调用ob_start()来扩展其值。你也可以指定一个$chunk_size,当buffer中的数据达到该值时,就会发送给浏览器。你可以通过指定$output_callback来处理buffer中的数据。
3. ob_get_contents:获取php buffer中的数据拷贝。但需要注意,应在ob_end_clean()函数调用之前使用此函数。
4. ob_end_flush与ob_end_clean:这两个函数都会关闭output_buffering机制,但有所不同。ob_end_flush将php buffer中的数据发送到客户端浏览器,而ob_end_clean则清空php buffer中的数据,但不发送给客户端。ob_end_flush调用后,php buffer中的数据依然存在,而ob_end_clean调用后,浏览器接收不到任何输出。
狼蚁网站的SEO优化旅程:模板加载程序代码
在狼蚁网站的SEO优化过程中,模板加载程序代码扮演着至关重要的角色。让我们深入理解这段代码,揭示其背后的奥秘。
我们来缓冲输出内容。为什么需要缓冲输出呢?主要有两个原因:一是为了提高速度,缓冲可以显著提升运行速度;二是为了使最终渲染的模板能够接受输出类的后期处理。
那么,为什么我们需要进行后期处理呢?其中一个原因是为了展示页面加载的耗时。如果我们不能在内容发送到浏览器之前进行拦截并启动计时器,那么就无法准确计时。
接下来,我们看到`ob_start()`函数的调用,它开启了输出缓冲。如果PHP安装不支持短标签,我们会进行短标签的替换,将它们转换为标准的PHP回显语句。这样做是为了确保代码在不同环境下的兼容性。
在替换短标记后,我们通过`include()`语句包含模板文件。这里选择`include()`而不是`include_once()`,是因为允许存在多个相同名称的视图。
紧接着,我们记录调试信息,标记文件加载的情况。如果请求返回文件数据,我们就会获取缓冲区的内容并返回。
然后,我们面临一个挑战:为了允许视图在其他视图中嵌套,我们需要在超出第一层输出缓冲时刷新内容,以确保它能被第一个包含的模板和任何后续模板正确看到和包含。这是一个复杂的步骤,但它是实现嵌套视图所必需的。
如果缓冲级别高于我们设置的级别加1,我们就会刷新缓冲。否则,我们将模板内容添加到输出流中,并清除缓冲区。
在完成了这些步骤后,我们调用`cambrian.render('body')`来呈现最终的网页主体。这一行代码是整个SEO优化过程中的点睛之笔,它使得狼蚁网站的页面能够以最优的方式呈现给用户。
狼蚁网站的SEO优化中的模板加载程序代码是一个精心设计的系统,旨在提高网站性能、兼容性和用户体验。通过深入理解这段代码,我们可以更好地欣赏其背后的技术和努力。
平面设计师
- php缓冲 output_buffering的使用详解
- javascript基础知识之html5轮播图实例讲解(44)
- php unicode编码和字符串互转的方法
- 在Vue中使用axios请求拦截的实现方法
- php上传图片生成缩略图(GD库)
- Vue组件开发技巧总结
- 在ASP中使用FSO组件生成HTML页面
- [译]ASP.NET Core 2.0 路由引擎详解
- jQuery+CSS实现一个侧滑导航菜单代码
- js获取时间函数及扩展函数的方法
- JSP过滤器防止Xss漏洞的实现方法(分享)
- PHP实现Unicode编码相互转换的方法示例
- PHP 爬取网页的主要方法
- 深入理解JavaScript系列(31):设计模式之代理模
- 纯js实现仿QQ邮箱弹出确认框
- vue.js 2.0实现简单分页效果