php.ini中有两个关键参数会影响到php的缓存输出控制:
output_buffering :on/off 或者整数 。设置为 on 时,将在所有脚本中使用输出缓存控制,不限制缓存的大小。而设置为整数时,如 output_buffering=4096,当缓存数据达到4096字节时会自动输出刷新缓存。而这个参数的不同正是导致以上代码在不同时候执行结果不同的原因。当 output_buffering 关闭时,脚本所有的输出(echo)都会即时发送到客户端,执行上面代码时就是每秒输出一个数字。而开启 output_buffering 后,输出内容就会先缓存在服务端,直到脚本结束时才一起发送给客户端。
implicit_flush:on/off。设定ON意味着,当脚本有输出时,自动立即发送到客户端。相当于在echo后自动加 flush()。
ob_start — 打开输出控制缓冲 (PHP 4, PHP 5, PHP 7)
当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。
ob_get_status — 得到所有输出缓冲区的状态 (PHP 4 >= 4.2.0, PHP 5, PHP 7)
array ob_get_status ([ bool $full_status
= FALSE ] )
返回最顶层输出缓冲区的状态信息;或者如果full_status
设为TRUE
,返回所有有效的输出缓冲级别。
ob_get_contents — 返回输出缓冲区的内容 (PHP 4, PHP 5, PHP 7)
返回输出缓冲区的内容,或者如果输出缓冲区无效将返回 FALSE
。
ob_get_length — 返回输出缓冲区内容的长度 (PHP 4 >= 4.0.2, PHP 5, PHP 7)
输出缓冲区内容的长度;或者返回FALSE
——如果没有起作用的缓冲区。
ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓冲区 (PHP 4 >= 4.3.0, PHP 5, PHP 7)
输出缓冲区的内容,并删除当前输出缓冲区。如果输出缓冲区不是活跃的,即返回 FALSE
。
ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_flush — 冲刷出(送出)输出缓冲区中的内容 (PHP 4 >= 4.2.0, PHP 5, PHP 7)
送出缓冲区的内容(如果里边有内容的话)到程序(PHP)缓冲,在调用ob_flush()之后缓冲区内容将被丢弃。
flush — 刷新输出缓冲 (PHP 4, PHP 5, PHP 7)
刷新PHP程序的缓冲,将当前为止程序的所有输出发送到用户的浏览器。flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。flush() 是刷新WebServer的缓冲区,而且只有apache的缓冲区会生效,使用nginx作为WebServer是不用生效的。
第一种解释:
在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态,flush() 可以将等待输出的内容立即发送到客户端。 开启缓存后,脚本输出的内容存入了输出缓存中,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而 ob_flush() 的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。
第二种解释:
ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。
ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲 (PHP 4, PHP 5, PHP 7)
送出最顶层缓冲区的内容(如果里边有内容的话),并关闭缓冲区。在调用ob_end_flush()后缓冲区内容被丢弃。ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制。
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲 (PHP 4, PHP 5, PHP 7)
丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。调用ob_end_clean()时缓冲区内容将被丢弃。
ob_clean — 清空(擦掉)输出缓冲区 (PHP 4 >= 4.2.0, PHP 5, PHP 7)
清空输出缓冲区中的内容
ob_implicit_flush — 打开/关闭绝对刷送 (PHP 4, PHP 5, PHP 7)
ob_implicit_flush ([ int $flag
= true ] ) 设为TRUE
打开绝对刷送,反之是 FALSE
。
将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。
相关函数
- ob_get_level — 返回输出缓冲机制的嵌套级别
- ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
- ob_list_handlers — 列出所有使用中的输出处理程序。
- output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
- output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)