CSS使用PHP扩展缩小

时间:2011-08-28 01:10:40

标签: php minify

我如何minify一个包含CSS内容的.php文件? 目前我收到400错误。

通常我会像这样调用minify

<link rel="stylesheet" type="text/css" 
       href="{$workspace}/min/f=workspace/css/common.css" />

修改

答案是改变缩小源代码,但我应该做出哪些改变?

换句话说..这个调用应该作为CSS工作和处理..

<link rel="stylesheet" type="text/css" 
      href="{$workspace}/min/f=workspace/css/common.php" />

也许有可选的声明?

<link rel="stylesheet" type="text/css" 
href="{$workspace}/min/f=workspace/css/common.php&type=css" />

修改

我在这里创建了项目@ https://github.com/into/less-less

4 个答案:

答案 0 :(得分:7)

只有在从服务器请求并由PHP解析之后,您的CSS + PHP脚本才会输出CSS。 Minify直接从服务器读取文件,跳过HTTP请求。所以我看到两条路:

  1. 不太理想[?]:make minify下载这样的CSS:

    <link rel="stylesheet" type="text/css" href="{$workspace}/min/f=http://site.com/workspace/css/common.php" />
    
  2. 在您的common.php文件中包含Minify lib,并在输出之前使用其classes(例如Minify_CSS)。像echo Minify_CSS::minify($css)

  3. 这样的东西

    <强>更新

    你的示例repo包含一个奇怪的文件名,不允许我拉/推,所以这里是改变的report.php:

    <pre>
    <strong>LESS in</strong>
    <?= file_get_contents('workspace/less/common.less') ?>
    - - - - -
    <strong>CSS out</strong>
    <?
    require 'workspace/php/lessc.inc.php';
    $lc = new lessc();
    $contents = file_get_contents( 'workspace/less/common.less' );
    $css = $lc->parse( $contents );
    echo $css;
    ?>
    <strong>Minified</strong>
    <?php
    require 'workspace/min/lib/Minify/CSS/Compressor.php';
    echo Minify_CSS_Compressor::process($css);
    ?>
    </pre>
    

答案 1 :(得分:1)

不,你不能轻易做到这一点,因为minify在很大程度上取决于文件扩展名(css,js,?)。例如,它用于确定哪些HTTP标头发送到客户端(application / x-javascript,text / css,?),要使用的minifier类,此文件是否可以安全解析等。

但我几乎可以肯定这种情况可以避免。你能说出你为什么要这么做吗?

如果你坚持这样做,我可以提出一些肮脏的黑客来使它工作,但它需要更改minify的源代码,所以我真的不知道这是不是一个好主意。

UPD:

没有很好的方法来改变这个来源:它的结构非常糟糕。在minify v2.1.3中,您只需更改以下内容:

路径:lib / Minify / Controller / Base.php ## Minify_Controller_Base :: _ fileIsSafe()

return in_array(strrev($revExt), array('js', 'css', 'html', 'txt'));

- &GT;

return in_array(strrev($revExt), array('js', 'css', 'html', 'txt', 'php'));

路径:lib / Minify / Controller / MinApp.php ## Minify_Controller_MinApp :: setupSources()

preg_match('/^[^,]+\\.(css|js)(?:,[^,]+\\.\\1)*$/', $_GET['f'])

- &GT;

preg_match('/^[^,]+\\.(css|js|php)(?:,[^,]+\\.\\1)*$/', $_GET['f'])

路径:lib / Minify / ## Minify_Source :: __ construct()

case 'css'  : $this->contentType = 'text/css';

- &GT;

case 'php': case 'css': $this->contentType = 'text/css';

并且一切都会正常工作,但您必须仔细设置$ min_serveOptions ['minApp'] ['allowDirs'],因为任何用户都可以从这个目录中查看任何php文件。

答案 2 :(得分:0)

使用CSS Min,你可以自由地做任何事情,你也可以在PHP脚本中“处理”你的stlyesheet,然后在飞行中缩小它:它的DEAD很简单,并且猜猜是什么,它只是A单一文件。

另一种方法是,不要使用任何PHP脚本来处理或在你的css文件中做一些逻辑,相反,你可以分离小的css文件然后你只需通过构建新的缓存文件来加载任何你想要的东西,或者只是组合并输出链接标记。

但是,如果你现在在你的common.php中有这样的东西(php文件/脚本输出css,是吗?)

<?php 
    $style = '';
    $bodyStyle =  'body {
            background-color: #000;
            margin: 40px;
            font: 13px/20px normal Helvetica, Arial, sans-serif;
            color: #fff;
            }';
    // I assumed you are about proccesing something here..
    // ...
    // Then you merged all style into one string, and output it as css file
    $style = $bodyStyle + $otherStyle + $whateverStyle;
    header('Content-Type: text/css');
    echo $style;
?>

你仍然希望让你的应用程序臃肿并使你的代码更难以阅读(等等,还有更多...),还想修改Minify类/ lib来缩小和缓存你的伪css-php,然后你需要“黑客”来源如下:

  • lib / Minify / Controller / Base.php:135,更改为:

    return in_array(strrev($revExt), array('js', 'css', 'html', 'txt', 'php'));

  • lib / Minify / Controller / MinApp.php:75,更改为:

    ! preg_match('/^[^,]+\\.(css|js|php)(?:,[^,]+\\.\\1)*$/', $_GET['f'])

  • lib / Minify / Source.php,改变了几件事:
  

在第41行之后添加一个变量作为PHP标志,或许

/**
 * @var bool
 */
public $isPHP = FALSE;
  

在同一个文件中,在第67行,添加一个条件:

case 'php'  : $this->isPHP = TRUE;
              $this->contentType = 'text/css';
              break;
  

最后,将getContent()函数替换为:

public function getContent()
{
    if($this->isPHP)
    {
        include($this->filepath);
    }
    else 
    {
        $content = (null !== $this->filepath)
                ? file_get_contents($this->filepath)
                : ((null !== $this->_content)
                    ? $this->_content
                    : call_user_func($this->_getContentFunc, $this->_id)
                );
    }

    // remove UTF-8 BOM if present
    return (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3))
        ? substr($content, 3)
        : $content;
}
  • 您还需要将common.php更改为Minify规范,现在,您的common.php应如下所示:
  

您需要将所有样式表作为字符串放入并将其分配到$content变量

<?php 
    //$style = '';
    $bodyStyle =  'body {
            background-color: #000;
            margin: 40px;
            font: 13px/20px normal Helvetica, Arial, sans-serif;
            color: #fff;
            }';
    // I assumed you are about proccesing something here..
    // ...
    // Then you merged all style into one string, and output it as css file
    // $style = $bodyStyle + $otherStyle + $whateverStyle;
    // header('Content-Type: text/css');
    // echo $style;
    $content = $bodyStyle + $otherStyle + $whateverStyle;
?>

答案 3 :(得分:0)

是的,有一个,效果很好:

https://github.com/c9s/pecl-cssmin

API非常简单:

<?php
echo cssmin("body { .... } .rule {  } .rule2 { color: #fff; }");