PHP输出缓冲区内容

PHP输出缓冲区内容,php,output-buffering,Php,Output Buffering,我正在使用PHP创建基于用户代理的动态样式表,包括: AddHandler application/x-httpd-php .css 我使用gzip(基于php.ini)将它们发送到客户端: 但我也想缩小我的动态样式表的内容,以获得更好的性能。。。因此,在我的样式表末尾,我放了: input.confirmation { <?php if ($Browser == 'lt8') { ?> margin-top: 1px; <?php } else { ?>

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

AddHandler application/x-httpd-php .css
我使用gzip(基于php.ini)将它们发送到客户端:

但我也想缩小我的动态样式表的内容,以获得更好的性能。。。因此,在我的样式表末尾,我放了:

input.confirmation
{
<?php if ($Browser == 'lt8') { ?>
    margin-top: 1px;
<?php } else { ?>
    margin-top: 3px;
<?php } ?>
}
<?php echo Minify(ob_get_clean()); ?>
但我宁愿避免这种做法,因为:

  • 如果需要的话,修改我的CSS将是一场真正的噩梦
  • 我只有一个样式表为我的整个网站,它是相当长的。。。因此,将其转换为基于变量的样式表可能会花费大量时间
  • 如何正确清除和覆盖输出缓冲区


    提前谢谢

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


    您可以做的是在脚本的开头再次执行显式的
    ob_start()
    ,这样您就可以得到第二个可以嵌套的缓冲区。一般来说,压缩应该很好地处理空白,因此缩小操作的增益最终应该不会太明显


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

    我没有在文件开头使用ob_start(),因为在php.ini中我设置了:“output_buffering=On”。不是吗?@Zarathos啊,那么你会想按照johannes的建议去做。我正计划在CSS中为我的图像文件添加一个指纹识别/版本控制系统,因为它们的过期“访问时间加上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)
    
    input.confirmation
    {
    <?php if ($Browser == 'lt8') { ?>
        margin-top: 1px;
    <?php } else { ?>
        margin-top: 3px;
    <?php } ?>
    }
    <?php echo Minify(ob_get_clean()); ?>
    
    <?php
        $Content = ob_get_contents();
        ob_clean();
        echo Minify($Content);
    ?>
    
    <?php echo Minify(ob_get_contents()); ?>
    
    $CSSCode  = '';
    [...]
    $CSSCode .= "#header";
    $CSSCode .= "{";
    $CSSCode .= "  display: block;";
    $CSSCode .= "  height: 100px;";
    $CSSCode .= "}";
    [...]
    echo Minify($CSSCode);