PHP性能:gzcompress()vs ob_start('ob_gzhandler')

时间:2013-10-27 21:51:43

标签: php performance caching gzip

我想知道如何最好地压缩输出。

通常我只需在ob_start('ob_gzhandler')的顶部添加index.php即可压缩整个输出。

我使用简单的缓存类将生成的HTML存储在文件(index.cache.htm)中,而不是在每次刷新时重建它。 index.cache.htm的内容由于更好的表现而缩小。

我不能压缩缓存的内容而不是使用ob_start('ob_gzhandler')吗?

示例1 (缓存缓冲的输出):

ob_start();                               // start buffer
$b = ob_get_contents();                   // get buffer
ob_end_clean();                           // free buffer

$b = CustomHTMLMinifyFunction($b);        // minify the HTML
$b = gzcompress($b);                      // compress the HTML
file_put_contents('index.cache.htm', $b); // save file

示例2 (缓存显式数据):

$d = 'Some data, e.g. JSON';              // some data
$d = gzcompress($d);                      // compress data
file_put_contents('data.cache.txt', $d);  // save file

差异或最佳做法是什么?提前谢谢!

编辑:将压缩数据存储在文件中是否有意义?或者它只在输出数据时有用?

1 个答案:

答案 0 :(得分:1)

ob_start

  

当输出缓冲区被刷新(发送)或清除(使用ob_flush()ob_clean()或类似功能)或输出时,将调用 [callback] 函数缓冲区在请求结束时刷新到浏览器。

换句话说,ob_get_contents()将返回未压缩内容的输出缓冲区:

$log = 0;

function callback($input){
    global $log;
    $log += 1;
    return ob_gzhandler($input);
}

ob_start('callback');
$ob = ob_get_contents();

echo $log; // echoes 0, callback function was not called

如果要缓存输出数据的压缩版本,则必须压缩ob_get_contents()的输出。

但您必须配置您的Web服务器,以便它知道文件已预先压缩(instructions for Apache)。您不能只在没有setting proper headers的情况下将压缩文件发送到您的客户端。

要回答您的编辑,预压缩缓存是有意义的,否则内容会动态压缩。另请注意,某些客户端不支持压缩:如果您希望能够为其提供服务,则应保留文件的未压缩版本。