1

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

通常我只是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

有什么区别或最佳做法?提前致谢!

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

4

1 回答 1

3

ob_start

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

换句话说,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 服务器,以便它知道文件是预压缩的(Apache 的说明)。您不能在不设置正确的标头的情况下将压缩文件发送到您的客户端。

为了回答您的编辑,预压缩缓存是有意义的,否则内容会被即时压缩。另请记住,某些客户端不支持压缩:如果您希望能够提供文件,则应保留文件的未压缩版本。

于 2013-10-28T00:21:53.393 回答