2011-08-28 19 views
6

Come posso minify un file .php con contenuto CSS?
Attualmente si verifica un errore 400.Minify CSS con estensione PHP

Normalmente mi chiamano minify come questo

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

EDIT

La risposta sta cambiando il codice sorgente minify, ma quello che è il cambiamento che dovrei fare?

In altre parole .. questa chiamata dovrebbe funzionare e di processo come CSS ..

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

Magari con dichiarazione d'opzione?

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

EDIT

Ho creato il progetto qui @https://github.com/into/less-less

+5

C'è una ragione specifica per cui siete dopo Minimizzando runtime? Perché incorrere l'overhead di server in più di fare questo (anche se sono in caching esso, è ancora almeno una query di database o di leggere il file che è inutile .. –

+0

sovraccarico del server in più? Rende impatto zero –

+0

Forse sto fraintendendo quello che si' stai cercando di ottenere .. Hai contenuti CSS in un file PHP che vuoi minimizzare al volo, correggi? –

risposta

7

tuo CSS + script PHP uscite CSS solo dopo che è richiesto da un server e analizzato da PHP. Minify legge i file direttamente dal server, saltando la richiesta HTTP. Così vedo due percorsi:

  1. meno ottimale [?]: Fare Minify scaricare il CSS in questo modo:

    <link rel="stylesheet" type="text/css" href="{$workspace}/min/f=http://site.com/workspace/css/common.php" /> 
    
  2. Includere Minify lib nel file common.php e utilizzare la sua classes (ad esempio, Minify_CSS) prima uscita. Qualcosa di simile echo Minify_CSS::minify($css)

Aggiornamento:

Il vostro esempio repo contiene un nome file strano che non mi permetteva di tirare/spingere in modo appropriato, quindi ecco la report.php mutato:

<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

Potresti scrivere l'opzione 2? Io non sono che la familiarità con le classi :(// ideale sarebbe una zip con minify che ho potuto scaricare .. che sarebbe sicuramente si guadagna la taglia. Grazie mille! –

+0

La prego di scrivere l'opzione 2? I' m non che la familiarità con le classi :(// ideale sarebbe una zip con minify che ho potuto scaricare .. che sarebbe sicuramente si guadagna la taglia Grazie mille –

+0

ho creato un progetto di pronti contro termine @ https:.! // github. com/in/meno-meno –

1

No, non si può facilmente farlo come minify pesantemente dipende estensioni di file (CSS, JS ,?). Ad esempio, viene utilizzato per determinare quali intestazioni HTTP inviare al client (application/x-javascript, text/css ,?), quale classe minifier usare, è sicuro che il file venga analizzato ecc.

Ma sono quasi certo che questa situazione può essere evitata. Potresti descrivere perché esattamente vuoi farlo?

Se si insiste per farlo in questo modo, posso proporre alcuni hack sporchi per farlo funzionare, ma è necessario modificare il codice sorgente di minify, quindi non so davvero se sia una buona idea.

Upd:

Non c'è bel modo per cambiare questa fonte: ha davvero male struttura. In v2.1.3 Minify si può semplicemente cambiare la seguente:

Percorso: lib/Minify/Controller/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')); 

Percorso: lib/Minify/controller/MinApp.php ## Minify_Controller_MinApp :: setupSources()

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

->

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

Percorso: lib/Minify/## Minify_Source :: __ construct()

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

->

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

e tutto funzionerà, ma è necessario impostare $ min_serveOptions [ 'minApp'] ['allowDirs'] nella configurazione con attenzione come qualsiasi utente può essere in grado di visualizzare qualsiasi file php da queste directory.

+0

Sì, voglio cambiare il minify codice sorgente. –

+0

Ho aggiornato il mio post, dovrebbe funzionare e dubito che potrebbe essere migliorato in quanto il codice sorgente è strutturato male, ma ancora una volta, ti scoraggio molto dal farlo in questo modo. – XzKto

+0

Ho creato un repository di progetto @ https://github.com/into/less-less –

0

Utilizzando CSS Min, si sono liberamente poteva fare alcun tipo e si potrebbe anche "elaborazione" il tuo stlyesheet in script php, quindi minify al volo: i suoi morti semplice per farlo, e indovinate un po ', solo un SINGL E FILE.

Un altro modo è, dont usare qualsiasi script PHP per elaborare o fare qualche logica al vostro file CSS, invece, si potrebbe avere separato piccolo file css poi basta caricare quello che vuoi con la costruzione di nuovi file di cache o semplicemente combinare e uscita il tag link.

Tuttavia, se ora hanno qualcosa di simile nel tuo common.php (file PHP/script che outputing il CSS, sì?)

<?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; 
?> 

E si vuole ancora rendere la vostra app gonfio e fare il tuo codice più illeggibile (aspetta, c'è ancora altro ...), vuole anche modificare Minify class/lib per minimizzare e memorizzare nella cache pseudo-css-php, quindi devi "hacking" come segue:

  • lib/Minify/controller/Base.php: 135, cambiare per:

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

  • lib/Minify/Controller/MinApp.php: 75, cambiare per:

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

  • lib/Minify/Fonte.php, cambiare diverse cose:

Aggiungi una variabile come una bandiera di PHP, in, dopo la linea 41 forse

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

In stesso file, alla riga: 67, aggiungere un condizione:

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

scorso, sostituire la funzione getContent(), in:

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; 
} 
  • È inoltre necessario modificare il common.php in Minify spec, così ora, la tua common.php dovrebbe apparire come:

è necessario mettere tutti i tuoi foglio di stile come stringa e assegnare in $content variabile

<?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

Ho creato un repo di progetto @ https://github.com/into/less-less –

0

Sì, ce n'è uno e funziona piuttosto bene:

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

L'API è piuttosto semplice:

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