【问题标题】:PHP Output Buffer ContentPHP 输出缓冲区内容
【发布时间】:2011-09-17 17:23:36
【问题描述】:

我正在使用 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. 我的整个网站只有一个样式表,而且它很长...因此将其转换为基于变量的样式表可能会非常耗时。

如何正确清除和覆盖输出缓冲区?

提前致谢!

【问题讨论】:

    标签: php output-buffering


    【解决方案1】:

    您可以做的是在脚本的开头再次执行明确的ob_start(),以便获得第二个缓冲区,因为它们可以嵌套。一般来说,压缩应该很好地处理空白,因此 Minify 操作的增益最终应该几乎不显着。

    备注:从脚本生成 CSS 等时,请确保设置正确的缓存过期标头,这样客户端就不会每次都请求 CSS 文件而是缓存它们。与您可以做的任何其他事情相比,这带来了更大的收益。

    【讨论】:

    • 我计划在 CSS 中为我​​的图像文件添加指纹/版本控制系统,因为它们具有 Expires “访问权限加 3 个月”,但如果我这样做,我将无法缓存 style.css... 因为,如果我更改图像,它在 CSS 中的指纹也会更改,如果我的任何图像的最后修改时间戳大于样式表,我应该发送一个全新的 style.css(具有正确的指纹) .
    • 我尝试在开头使用“ob_start()”,然后在结尾使用“echo Minify(ob_get_clean()); ob_end_flush();”。它就像一个魅力。我希望它是正确的。
    • 如果我们需要将缓冲结果作为临时文件,我们可以使用这个代码:$fp = tmpFile(); fwrite($fp, ob_get_contents()); fseek($fp, 0);
    【解决方案2】:

    ob_start 之后,您必须ob_end_clean(或使用其变体之一),否则输出缓冲仍处于打开状态,不会输出任何内容。 =)

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

    【讨论】:

    • 我没有在文件开头使用 ob_start(),因为在我的 php.ini 中我设置了:“output_buffering = On”。不是吗?
    • @Zarathos 啊,那你就按照约翰内斯的建议去做吧。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多