PHP输出缓冲区内容

时间:2011-09-17 17:23:37

标签: php output-buffering

我正在使用PHP创建基于用户代理的动态样式表:

AddHandler application/x-httpd-php .css

我使用gzip(基于php.ini)将它们发送到客户端:

output_handler = ob_gzhandler

但我也希望缩小动态样式表的内容以获得更好的表现......所以,在我的样式表的末尾我放了:

input.confirmation
{
<?php if ($Browser == 'lt8') { ?>
    margin-top: 1px;
<?php } else { ?>
    margin-top: 3px;
<?php } ?>
}
<?php echo Minify(ob_get_clean()); ?>

其中“function Minify($ CSSCode)”只返回我在参数中放入的字符串的缩小版本。问题是这只是输出一个空的样式表。我还尝试了以下代码:

<?php
    $Content = ob_get_contents();
    ob_clean();
    echo Minify($Content);
?>

但是我获得了相同的结果:空文件。如果我改用:

<?php echo Minify(ob_get_contents()); ?>

我的shylesheet将包含未经编码和缩小的代码。 我想到的一个解决方案是连接变量中的每一个样式表行并最终打印出来,如下所示:

$CSSCode  = '';
[...]
$CSSCode .= "#header";
$CSSCode .= "{";
$CSSCode .= "  display: block;";
$CSSCode .= "  height: 100px;";
$CSSCode .= "}";
[...]
echo Minify($CSSCode);

但我宁愿避免这种做法,因为:

  1. 如果需要,修改我的CSS将是一场真正的噩梦。
  2. 我的整个网站只有一个样式表,而且它很长...所以将它转换为基于变量的样式表可能会非常耗时。
  3. 如何正确清除和覆盖输出缓冲区?

    提前致谢!

2 个答案:

答案 0 :(得分:2)

您可以做的是在脚本的开头再次执行显式ob_start(),以便获得第二个缓冲区,因为它们可以嵌套。一般来说,压缩应该好好照顾空白,所以Minify操作的收益最终几乎不值得注意。

作为评论:从脚本生成CSS等时,请确保设置正确的缓存过期标头,以便客户端不会每次都请求CSS文件,而是缓存它们。这比你可以做的任何事情带来更大的收益。

答案 1 :(得分:0)

ob_start之后,您必须ob_end_clean(或使用其中一种变体),否则输出缓冲仍然为ON,并且不会输出任何内容。 =)

http://php.net/manual/en/function.ob-end-clean.php