Revision: 31308
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at September 2, 2010 16:57 by Sverri
Initial Code
// 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); }
Initial URL
Initial Description
The code is not particularly pretty but it does the job. If you call this file css.php you can call it like this: css.php?files=reset,style,iefix&minify=yes
Initial Title
Combine and minify CSS using get query string
Initial Tags
css
Initial Language
PHP