我如何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
答案 0 :(得分:7)
只有在从服务器请求并由PHP解析之后,您的CSS + PHP脚本才会输出CSS。 Minify直接从服务器读取文件,跳过HTTP请求。所以我看到两条路:
不太理想[?]:make minify下载这样的CSS:
<link rel="stylesheet" type="text/css" href="{$workspace}/min/f=http://site.com/workspace/css/common.php" />
在您的common.php文件中包含Minify lib,并在输出之前使用其classes(例如Minify_CSS)。像echo Minify_CSS::minify($css)
<强>更新强>
你的示例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'])
在第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;
}
您需要将所有样式表作为字符串放入并将其分配到
$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; }");