PHP 使用get查询字符串组合和缩小CSS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 使用get查询字符串组合和缩小CSS相关的知识,希望对你有一定的参考价值。

// css.php

/*
  If you name this file "css.php" then you can call it
  using a GET query string like this:
  
  - css.php?files=reset,style,iefix&minify=yes
  
  There are two parts to the query string:
  
  1. The "files" part. Add your file names (with or
     without .css) in a comma-separated list.
  
  2. The "minify" part. You can add "yes" to it, or
     omit it entirely.
  
  When you have done this and loaded the file once the
  script will cache, update, serve files and handle
  everything else. You only have to specify which files
  should be loaded and if it should be minified.
  
  The script will automatically update the cached files
  whenever they become outdated, so you can edit your
  individual CSS files as much as you like without
  worrying about getting the most recent file.
*/


// Handle the query string

if (isset($_GET['files']) && !empty($_GET['files'])) {
  $files = explode(',', strip_tags($_GET['files']));
} else {
  $files = null;
}
if (isset($_GET['minify']) && !empty($_GET['minify'])) {
  $minify = (strip_tags($_GET['minify'])=='yes') ? true : false;
} else {
  $minify = false;
}

// Get the file names

$filesMissing = 0;
foreach ($files as $key => &$name) {
  $name = trim($name);
  if (empty($name)) {
    unset($files[$key]);
    continue;
  }
  if (substr($name,-4) !== '.css') {
    $name .= '.css';
  }
  if ( ! file_exists($name)) {
    $filesMissing++;
  }
  $dates[] = filemtime($name);
}

// If there are no file names, or if a file does not exist
// then 404; Houston we have a problem...

if (empty($files) || $filesMissing > 0) {
  header("HTTP/1.0 404 Not Found");
  exit();
}

// Is there a cached version and is it newer than the non-cached
// files? If there is one then go directly to output

// !!! Make sure the directory "cached" is writeable !!!

$cachedFileName = 'cached/'.crc32(implode('.',$files)).($minify?'.min':'').'.css';
$useCache = false;

if (file_exists($cachedFileName)) {
  $cachedLastModified = filemtime($cachedFileName);
  foreach ($dates as $d) {
    if ($cachedLastModified < $d) { $useCache = false; break; }
  }
  if ($useCache) {
    $code = file_get_contents($cachedFileName);
    goto output;
  }
}

// If there is no cached version, or if the cached version is older
// than the css files, then get the code from the css files and save a
// cached version for future use

$code = '';
foreach ($files as $name) {
  $code .= file_get_contents($name)."\n\n";
}
if ($minify) {
  $code = minifyCSS($code);
}
$f = fopen($cachedFileName, 'w');
fwrite($f, $code);
fclose($f);
$cachedLastModified = filemtime($cachedFileName);

// The output

output:
{
  header('Content-type: text/css; charset=utf-8');
  header('Last-Modified: '.gmdate('D, d M Y H:i:s',$cachedLastModified).' GMT');
  header('Expires: '.gmdate('D, d M Y H:i:s', time()+604800).' GMT'); // 1 week
  header('Cache-Control: max-age=604800'); // 1 week
  $encoding = false;
  $httpEncoding = strip_tags($_SERVER['HTTP_ACCEPT_ENCODING']);
  if(strpos($httpEncoding, 'x-gzip') !== false) {
    $encoding = 'x-gzip';
  }
  elseif(strpos($httpEncoding, 'gzip') !== false) {
    $encoding = 'gzip';
  }
  if ($encoding) {
    header('Content-Encoding: '.$encoding);
    $code = gzcompress($code, 9);
  }
  echo $code;
}

// Function for minifying CSS code
// Removes or truncates unecessary characters, whitespace and newlines
function minifyCSS($code) {
  return preg_replace(array('/\/\*[\s\S]*?\*\//','/\s*([;:{},>+])\s*/','/(;})/',
  '/\r?\n/','/\t/'),array('','\1','}','',''),$code);
}

以上是关于PHP 使用get查询字符串组合和缩小CSS的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用php压缩和缩小CSS

用php压缩和缩小CSS

更新css文件并缩小它

将供应商 CSS 与 LESS 结合后以及 gulp-minify 后 Sourcemap 错误

在 CodeIgniter 中有效地缩小 CSS 和 JS

用PHP缩小CSS