Минимизация CSS с расширением PHP

Как я могу минифицировать файл .php с содержимым CSS?
В настоящее время я получаю сообщение об ошибке 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.


person Kirk Strobeck    schedule 28.08.2011    source источник
comment
Есть ли конкретная причина, по которой вы после минимизации во время выполнения? Зачем нести дополнительные накладные расходы сервера на это (даже если вы его кешируете, это все равно, по крайней мере, запрос к базе данных или чтение файла, которые не нужны.   -  person Demian Brecht    schedule 29.08.2011
comment
дополнительная нагрузка на сервер? это не оказывает никакого влияния   -  person Kirk Strobeck    schedule 29.08.2011
comment
Может быть, я неправильно понимаю, чего вы пытаетесь достичь. У вас есть содержимое CSS в файле PHP, которое вы хотите минимизировать на лету, верно?   -  person Demian Brecht    schedule 29.08.2011
comment
Тогда есть накладные расходы сервера, неявно связанные с вашим предлагаемым решением. Вы будете запускать код через порожденный процесс PHP, чтобы минимизировать свои скрипты. Я еще не видел ситуации, когда вы не можете написать скрипт быстрой сборки, используя компрессор YUI, минимизацию и т. д., который генерирует то, что вам нужно. Затем вы обслуживаете файлы через веб-сервер, не затрагивая ваш процесс PHP.   -  person Demian Brecht    schedule 29.08.2011
comment
Конечно, это только я .. Всегда ищу легкий выигрышный цикл, экономя здесь и там ;)   -  person Demian Brecht    schedule 29.08.2011
comment
Я создал репозиторий проекта @ github.com/into/less-less.   -  person Kirk Strobeck    schedule 02.09.2011
comment
Вас может заинтересовать расширение cssmin github.com/c9s/pecl-cssmin.   -  person c9s    schedule 25.10.2014


Ответы (4)


Ваш сценарий CSS+PHP выводит CSS только после того, как он запрошен с сервера и проанализирован PHP. Minify читает файлы напрямую с сервера, пропуская HTTP-запрос. Итак, я вижу два пути:

  1. Менее оптимально [?]: сделать так, чтобы minify загрузил CSS следующим образом:

    <link rel="stylesheet" type="text/css" href="{$workspace}/min/f=http://site.com/workspace/css/common.php" />
    
  2. Включите библиотеку Minify в файл common.php и используйте ее классы (например, Minify_CSS) перед выводом. Что-то вроде 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>
person Andrew    schedule 31.08.2011
comment
Не могли бы вы написать вариант 2? Я не очень хорошо разбираюсь в классах :( // в идеале это был бы zip-архив с minify, который я мог бы скачать.. это определенно принесло бы вам награду. Большое спасибо! - person Kirk Strobeck; 31.08.2011
comment
Не могли бы вы написать вариант 2? Я не очень хорошо разбираюсь в классах :( // в идеале это был бы zip-архив с minify, который я мог бы скачать.. это определенно принесло бы вам награду. Большое спасибо! - person Kirk Strobeck; 02.09.2011
comment
Проверьте отредактированный ответ, поле для комментариев не работает для кода. - person Andrew; 04.09.2011

Нет, вы не можете легко сделать это, так как минимизация сильно зависит от расширений файлов (css, js,?). Например, он используется для определения того, какие заголовки HTTP отправляются клиенту (application/x-javascript, text/css,?), какой класс минификатора использовать, является ли этот файл безопасным для анализа и т. д.

Но я почти уверен, что этой ситуации можно избежать. Не могли бы вы описать, почему именно вы хотите это сделать?

Если вы настаиваете на том, чтобы сделать это таким образом, я могу предложить несколько грязных хаков, чтобы заставить его работать, но это требует изменения исходного кода minify, поэтому я действительно не знаю, хорошая ли это идея.

Обновление:

Нет хорошего способа изменить этот источник: у него очень плохая структура. В minify v2.1.3 вы можете просто изменить следующее:

Путь: 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'));

Путь: lib/Minify/Controller/MinApp.php##Minify_Controller_MinApp::setupSources()

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

-->

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

Путь: lib/Minify/##Minify_Source::__construct()

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

-->

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

и все будет работать, но вы должны тщательно установить $min_serveOptions['minApp']['allowDirs'] в конфигурации, так как любой пользователь может просматривать любой файл php из этих каталогов.

person XzKto    schedule 30.08.2011
comment
Я обновил свой пост, он должен работать, и я сомневаюсь, что его можно было бы улучшить, так как исходный код плохо структурирован, но опять же, я настоятельно не рекомендую вам делать это таким образом. - person XzKto; 31.08.2011

Используя CSS Min, вы можете свободно делать что угодно, а также можете "обрабатывать" свой stlyesheet в php, а затем минимизируйте его на лету: сделать это ОЧЕНЬ просто, и знаете что, это всего лишь ОДИН ФАЙЛ.

Другой способ: не используйте какой-либо 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 для минимизации и кэширования вашего псевдо-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, измените несколько вещей:

Добавьте одну переменную в качестве флага 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 на спецификацию 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;
?>
person toopay    schedule 31.08.2011

Да, есть один, и он работает довольно хорошо:

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

API довольно прост:

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