php缓存基本知识

一、打开缓存

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
output_callback此函数把一个字符串当作参数并返回一个字符串,当 output_callback 被调用时,它将收到输出缓冲区的内容作为参数 并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器此函数会在下面情况下被调用到:
  1:输出缓冲区被( ob_flush(), ob_clean() 或者相似的函数)冲刷(送出)或者被清洗的时候;
  2:请求结束之际输出缓冲区内容被冲刷到浏览器时(无论调用不调用ob_flush这些刷新或输出缓存区的函数,到程序执行结尾都会输出缓存区中的内容。
如:
ob_start();
echo '222';  //虽然开启了缓存,但是脚本执行最后会输出,而不用调用ob_flush这些的函数来触发输出
注意:
  1、如果这个 output_callback 不是一个可以调用的函数,此函数 会返回 FALSE 。如果 output_callback 返回 FALSE ,其原来的输入 内容被直接送到浏览器。
这个参数 output_callback 可以通过直接给一个 NULL 值而避开。如果想要删除缓冲区的内容,从回调函数中返回一个"" (空字符串)。

2、当缓存打开的时候,没有输出能从脚本送出(除http标头外)
chunk_size如果可选参数 chunk_size 被赋值了,在任何一个能引起缓冲区的长度等于 或超过 chunk_size 的输出操作后,缓冲区都会被刷送。 默认值 0 意味着函数仅在最后被调用,其余的特殊值可以将 chunk_size 从 1 设定到 4096。
erase:如果可选参数 erase 被赋成 FALSE,直到脚本执行完成缓冲区才被删除。 这使得,如果调用了冲刷和清洗(清除)函数,会抛出一个“notice”,并返回 FALSE 值。

例子:

<?php

function callback($buffer)
{
  // replace all the apples with oranges
  return (str_replace("apples", "oranges", $buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush();

?> 

二、获得缓存区的内容信息

1:string ob_get_contents ( void )  只是得到输出缓冲区的内容,但不清除它。(此函数返回输出缓冲区的内容,或者如果输出缓冲区无效将返回FALSE 。)
2:int ob_get_length ( void ) (返回输出缓冲区内容的长度;或者返回FALSE——如果没有起作用的缓冲区。)
3:array ob_get_status ([ bool $full_status = FALSE ] )  ob_get_status()返回最顶层输出缓冲区的状态信息;或者如果full_status设为TRUE,返回所有有效的输出缓冲级别。
Array
(
    [0] => Array
        (
            [chunk_size] => 0
            [size] => 40960
            [block_size] => 10240
            [type] => 1
            [status] => 0
            [name] => default output handler
            [del] => 1
        )

    [1] => Array
        (
            [chunk_size] => 0
            [size] => 40960
            [block_size] => 10240
            [type] => 0
            [buffer_size] => 0
            [status] => 0
            [name] => URL-Rewriter
            [del] => 1
        )

)

4:ob_get_clean 得到当前缓冲区的内容并删除当前输出缓。
 
三、输出缓存中的内容
1:自然输出,不用调用任何刷新函数,程序执行完会输出缓存中的内容
ob_start();
echo '222';  //虽然开启了缓存,但是脚本执行最后会输出,而不用调用ob_flush这些的函数来触发输出

2:void flush ( void )和 ob_flush函数同用   刷新PHP程序的缓冲,该函数将当前为止程序的所有输出发送到用户的浏览器。

flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 

个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。

3:bool ob_end_flush ( void ) 冲刷出(送出)输出缓冲区内容并关闭缓冲

这个函数将送出最顶层缓冲区的内容(如果里边有内容的话),并关闭缓冲区。如果想进一步处理缓冲区中的内容,必须在ob_end_flush()之前调用 ob_get_contents(),因为在调用ob_end_flush()后缓冲区内容被丢弃。 
这个函数与ob_get_flush()相似,不同的是ob_get_flush()会把缓冲区中的内容作为字符串返回。
 

四、关闭缓存区

1:ob_clean清空(擦掉)输出缓冲区, 此函数用来丢弃输出缓冲区中的内容。而不会销毁输出缓冲区,而像 ob_end_clean() 函数会销毁输出缓冲区。

2:ob_end_clean清空(擦除)缓冲区并关闭输出缓冲(此函数丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。)

3:ob_end_flush冲刷出(送出)输出缓冲区内容并关闭缓冲  (输出 + 关闭)

4:ob_get_clean得到当前缓冲区的内容并删除当前输出缓。

 

全局配置:

ob_implicit_flush打开/关闭绝对刷送

ob_implicit_flush()将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。 

辅助函数:

ob_list_handlers列出所有使用中的输出处理程序。

ob_gzhandler在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer(ob_gzhandler() 需要 zlib 扩展。)

 

例子:

Yii中CBaseController显示视图的方法

 /**
 * Renders a view file.
 * This method includes the view file as a PHP script
 * and captures the display result if required.
 * @param string $_viewFile_ view file
 * @param array $_data_ data to be extracted and made available to the view file
 * @param boolean $_return_ whether the rendering result should be returned as a string
 * @return string the rendering result. Null if the rendering result is not required.
 */
public function renderInternal($_viewFile_,$_data_=null,$_return_=false)
{
    // we use special variable names here to avoid conflict when extracting data
    if(is_array($_data_))
        extract($_data_,EXTR_PREFIX_SAME,'data');
    else
        $data=$_data_;
    if($_return_)                        //如果不返回模板的内容,启用缓存来获取
    {
        ob_start();
        ob_implicit_flush(false);
        require($_viewFile_);
        return ob_get_clean();
    }
    else
        require($_viewFile_);
}

 

原文地址:https://www.cnblogs.com/Alight/p/3099036.html