2011-08-28 121 views
6

我怎样才能minify一个.php文件,CSS内容是什么?
目前,我得到一个400错误。与PHP扩展CSS缩小

通常我打电话缩小这样

<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

+5

有你为什么运行时缩小文件后,是一个具体的原因是什么?为什么会招致这种额外的服务器开销(即使你正在缓存它,它仍然至少是一个数据库查询或文件读取,这是不必要的.. –

+0

额外的服务器开销?它使零影响 –

+0

也许我误解了你'重新尝试实现..你有一个PHP文件中的CSS内容,你想在飞行中缩小,是否正确? –

回答

7

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

  1. 不太理想[?]:使缩小下载这样的CSS:

    <link rel="stylesheet" type="text/css" href="{$workspace}/min/f=http://site.com/workspace/css/common.php" /> 
    
  2. 包括缩减大小的lib在你的common.php文件,使用其classes(如输出之前)。喜欢的东西echo Minify_CSS::minify($css)

更新:

你的榜样回购包含不让我拉一个奇怪的文件名/推适当的,所以这里的改变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> 
+0

你能写出选项2吗?我不是很熟悉类:(//理想的情况下,它会是一个缩小的zip,我可以下载..这肯定会让你获得赏金,非常感谢! –

+0

你能写出选项2吗? m不是很熟悉类:(//理想的情况下,它会是一个缩小的zip,我可以下载..这肯定会让你获得赏金,非常感谢! –

+0

我创建了一个项目回购@ https:// github。 com/into/less-less –

1

不,你不能轻易地做到这一点的缩小很大程度上依赖于文件扩展名(CSS,JS,?)。例如,它用于确定HTTP头向客户端发送什么(应用程序/ x-javascript,文本/ css ,?),要使用哪个缩小器类,此文件是否安全解析等。

但我几乎肯定可以避免这种情况。你可以请说明到底为什么要这么做?

如果你坚持做,这样我可以提出一些诡异的技巧,使其工作,但它需要改变缩小的源代码,所以我真的不知道,如果这是一个好主意。

UPD:

有没有很好的办法来改变这种源:它有非常糟糕的结构。在缩小V2.1.3,你可以简单地改变如下:

路径:LIB /缩减大小/控制器/ Base.php ## Minify_Controller_Base :: _ fileIsSafe()

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

- >

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

路径:LIB /缩减大小/控制器/ MinApp.php ## Minify_Controller_MinApp :: setupSources()

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

- >

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

路径:LIB /缩减大小/ ## Minify_Source :: __结构()

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

- >

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

这样就可以了,但是你必须用$ min_serveOptions [ “minApp”] [“allowDirs”〕中配置仔细作为任何用户可以能够从该目录查看任何PHP文件。

+0

是的,我想改变minify源代码。 –

+0

我更新了我的帖子,它应该可以工作,并且我怀疑它可以做得更好,因为源代码结构严重不足,但是我再次强烈建议您不要这样做。 – XzKto

+0

我创建了一个项目回购@ https://github.com/into/less-less –

0

使用CSS Min,你可以自由地做任何事情,你也可以在php脚本中“处理”你的stlyesheet,然后在飞行中缩小它:它的DEAD简单的做到这一点,并猜测它,只是一个SINGL E文件。

另一种方式是,不要使用任何PHP脚本来处理或在你的css文件做一些逻辑,相反,你可以分开小css文件,然后你只需通过构建新的缓存文件或只是组合和输出链接标签。

但是,如果你现在有这样的事情在你的common.php(PHP文件/脚本outputing的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 /缩减大小/控制器/ MinApp.php:75,变化到:

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

  • LIB /缩减大小/源。PHP,改变几件事情:

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

/** 
* @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成缩减大小的规格,所以现在,您的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; 
?> 
+0

我创建了一个项目回购@ https://github.com/into/less-less –