buffer ---- flush()
buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的
设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入
一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁
盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。
同样的道理,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php
output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php
buffer写满的时候,脚本进程会将php
buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring -> php
buffer -> tcp buffer -> browser
php output_buffering --- ob_flush()
默认情况下,php
buffer是开启的,而且该buffer默认值是4096,即1kb。你可以通过在php.ini配置文件中找到output_buffering配
置.当echo,print等输出用户数据的时候,输出数据都会写入到php
output_buffering中,直到output_buffering写满,会将这些数据通过tcp传送给浏览器显示。你也可以通过
ob_start()手动激活php
output_buffering机制,使得即便输出超过了1kb数据,也不真的把数据交给tcp传给浏览器,因为ob_start()将php
buffer空间设置到了足够大
。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。
这两个函数的使用怕是很多人最迷惑的一个问题,手册上对两个函数的解释也语焉不详,没有明确的指出它们的区别,似乎二者的功能都是刷新输出缓存。但在我们
文章一开始的代码中如果讲fush()替换成ob_flush(),程序就再不能正确执行了。显然,它们是有区别的,否则也手册中直接说明其中一个是另外
一个函数的别名即可了,没必要分别说明。那么它们的区别到底是什么呢?
在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态
,flush()可以将等待输出的内容立即发送到客户端。
开
启缓存后,脚本输出的内容存入了输出缓存中
,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而
ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端
,这时你就需要先使用
ob_flush()再使用flush(),客户端才能立即获得脚本的输出。
一.flush和ob_flush的正确顺序,正确应是,先ob_flush再flush,如下:
ob_flush();
flush();
如果Web服务器的操作系统是windows系统,那顺序颠倒或者不使用ob_flush()也不会出现问题。[有待求证
] 但是在Linux系统上就无法刷新输出缓冲。
output buffering函数
1.bool
ob_start
([
callback
$output_callback
[, int
$chunk_size
[, bool
$erase
]]] )
激活output_buffering机制。一旦激活,脚本输出不再直接出给浏览器,而是先暂时写入php buffer内存区域。
php默认开启output_buffering机制,只不过,通过调用ob_start()函数据output_buffering值扩展到足够
大
。也可以指定$chunk_size来指定output_buffering的值。$chunk_size默认值是0,表示直到脚本运行结束,php
buffer中的数据才会发送到浏览器。如果你设置了$chunk_size的大小
,则表示只要buffer中数据长度达到了该值,就会将buffer中
的数据发送给浏览器。
当然,你可以通过指定$ouput_callback,来处理buffer中的数据。比如函数ob_gzhandler,将buffer中的数据压缩后再传送给浏览器。
第三个参数:是否擦除缓存,可选,默认是true,如果设置为false,则在脚本执行结束前,缓存都不会被清除。
2.ob_get_contents
获取一份php buffer中的数据拷贝。值得注意的是,你应该在ob_end_clean()函数调用前调用该函数,否则ob_get_contents()返回一个空字符中。
可以使用ob_get_contents()以字符串形式获取服务端缓存的数据,
使用ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。
而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。
服务端的缓存是堆叠起来的,也就是说你在开启了ob_start()后,关闭之前,在其内部还
可以开启另外一个缓存ob_start()。
不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。
ob_start()
可以指定一个回调函数来处理缓存数据,如果一个ob_start()内部嵌套了另一个ob_start(),我们假定,外层的ob_start(),编号
是A,内层的ob_start()编号是B,它们各自制定了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它
会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理,之后才能输出到客户端。
另外,手册说,对于某些web服务器,比如apache,在使用回调函数有可能会改变程序当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用chdir函数,这点似乎不常遇到,遇到的时候记得去查手册吧。
3.ob_end_flush与ob_end_clean
这二个函数有点相似,都会关闭ouptu_buffering机制。但不同的是,ob_end_flush只是把php
buffer中的数据冲(flush/send)到客户端浏览器,而ob_clean_clean将php
bufeer中的数据清空(erase),但不发送给客户端浏览器。
ob_end_flush调用之前
,php
buffer中的数据依然存在,ob_get_contents()依然可以获取php
buffer中的数据拷贝。
而ob_end_flush()调用之后
ob_get_contents()取到的是空字符串,同时浏览器也接收不到输出,即
没有任何输出。
可以使用ob_get_contents()以字符串形式获取服务端缓存的数据,使用ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。
而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。
服务端的缓存是堆叠起来的,也就是说你在开启了ob_start()后,关闭之前,在其内部还可以开启另外一个缓存ob_start()。不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。
ob_start()
可以指定一个回调函数来处理缓存数据,如果一个ob_start()内部嵌套了另一个ob_start(),我们假定,外层的ob_start(),编号
是A,内层的ob_start()编号是B,它们各自制定了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它
会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理,之后才能输出到客户端。
另外,手册说,对于某些web服务器,比如apache,在使用回调函数有可能会改变程序当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用chdir函数,这点似乎不常遇到,遇到的时候记得去查手册吧。
分享到:
相关推荐
在PHP编程中,`flush()`, `ob_flush()`, 和 `ob_end_flush()` 是三个用于处理输出缓冲(Output Buffering)的函数,它们之间有着不同的功能和用途。理解这三个函数的区别对于优化网页的动态内容输出至关重要,特别是...
`ob_flush` 和 `flush` 是两个非常关键的函数,用于处理输出缓冲。 `ob_flush()` 函数的作用是将PHP输出缓冲区中的内容发送到浏览器,而 `flush()` 则是尝试将缓冲区的内容立即发送到客户端,即使服务器端仍有数据...
在PHP编程中,`ob_flush()` 和 `flush()` 是两个重要的输出控制函数,它们主要用于处理输出缓冲区。本文将深入探讨这两个函数的区别以及如何正确使用它们。 首先,我们需要理解什么是输出缓冲区。在PHP中,当脚本...
总结起来,`ob_flush`和`flush`是用于处理PHP输出缓冲区的组合工具,它们共同作用于PHP自身和Web服务器的缓冲区,以实现逐行输出或实时更新的效果。理解它们的工作机制和相互配合的使用方式,对于优化用户体验和解决...
本篇将详细介绍一种基于`ob_start()`和Smarty模板引擎的PHP静态页面生成方法。 1. **输出缓冲控制函数**: `ob_start()`是PHP中用于开启输出缓冲区的函数,它会将程序生成的所有输出存储在内存中,而不是立即发送...
在PHP编程中,`flush()`和`ob_flush()`都是用于处理输出缓冲的函数,但它们在功能和使用场景上存在一些关键的区别。本篇文章将详细阐述这两个函数的原理和它们在实际应用中的差异。 首先,了解缓冲的概念。缓冲...
`ob_flush` 和 `flush` 是两个常用于处理输出缓冲的函数,但它们的作用和使用场景有所不同。理解这两个函数的区别对于编写高效、可移植的PHP代码至关重要。 首先,`ob_flush` 属于 `ob_*` 系列函数,它主要负责处理...
必须使用`ob_end_flush()`或`flush()`等函数显式输出缓冲区内容。 3. **ob_get_contents** - **函数格式**:`ob_get_contents();` - **说明**:获取当前输出缓冲区的内容。如果输出缓冲未开启,则返回`FALSE`。 ...
PHP输出缓冲函数主要包括ob_start(), ob_get_contents(), ob_end_clean(), ob_get_clean()等,这些函数在Web开发中非常有用,能够有效地管理输出的内容,特别是在进行复杂的输出操作或文件传输时。下面将详细介绍...
本文实例分析了php中ob_flush函数和flush函数用法。分享给大家供大家参考。具体如下: ob_flush()函数: 取出PHP buffering中的数据,放入server buffering flush()函数: 取出Server buffering的数据,放入browser ...
需要注意的是,在使用ob_start()及其变体时,必须确保在整个脚本的生命周期内使用ob_end_clean()或ob_end_flush()来结束输出缓冲,否则会导致后续的内容无法输出,或者出现输出不正常的情况。ob_end_clean()会清除...
当`ob_start()`被调用时,PHP会开始在内存中存储所有输出的内容,直到`ob_end_flush()` 或其他 `ob_end_XXX()` 函数被调用,此时才会将缓冲区中的内容发送到浏览器。 `ob_gzhandler()` 是一个预定义的输出处理器,...
在这个例子中,`ob_start()`开启缓冲,然后输出的内容会被保存,直到`ob_end_flush()`被调用,这时才将缓冲区的内容发送到浏览器。在这两者之间,可以设置HTTP头信息,例如`header()`函数,它必须在任何输出之前调用...
1. CLI模式:在命令行环境中运行PHP,如在Linux上通过`php5 test.php`执行,此时PHP不依赖于Web服务器,可以直接输出结果,所以`sleep(1)`和`ob_flush()`、`flush()`组合能按预期工作。 2. Apache配合Flush:尽管...
在Nginx环境中,当你尝试使用PHP的`ob_flush`和`flush`函数进行逐行输出时,可能会遇到输出不实时的问题。这个问题通常与Nginx的内部缓冲机制有关。Nginx作为反向代理服务器,它会在接收到后端应用(如PHP-FPM)的...