2011-08-28 97 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 –