UPDATE
All is working as it should be. I have no idea why. I guess the problem was with my re-write rule and not the script, since that is the only thing I have changed recently.
This really is a nice workflow solution, give it a go. You can reduce all the js / css in the <head> down to 2 files and leave comments in them pointing to the originals for fellows devs peeking at your code. Combined with a css sprites approach for you core site images, you can reduce your connections from dozens down to a mere handful (if you’re careful) - giving you improved performance on high capacity sites.
Not sure if its worth it on sites with a low user base, but still a single css file, and compressed js file will download quicker than a handful of each... Since the majority of browsers can, by default, only make 2 simultaneous requests to a site at a time. Once a site is complete and you know you probably won’t touch the css for a while, You could even open up the merged / cached css, manually compress it using the many css compression utilities about, paste it back in to the cache file and save it. Resulting in a tiny single css files, leaving all of the originals intact and readable.
Just food for thought I guess..
<?php
// Written by Ed Eliot (www.ejeliot.com) - provided as-is, use at your own risk
/****************** start of config ******************/
define('FILE_TYPE', 'text/css'); // type of code we're outputting
define('CACHE_LENGTH', 31356000); // length of time to cache output file, default approx 1 year
define('CREATE_ARCHIVE', true); // set to false to suppress writing of code archive, files will be merged on each request
define('ARCHIVE_FOLDER', 'styles/dev2/archive'); // location to store archive, don't add starting or trailing slashes
// files to merge
$aFiles = array(
'styles/dev2/aesthetics.css',
'styles/dev2/structural.css'
);
/****************** end of config ********************/
// this is prepended to all file / folder paths so files and archive folder should be specified relative to this
$sDocRoot = $_SERVER['DOCUMENT_ROOT'];
/*
if etag parameter is present then the script is being called directly, otherwise we're including it in
another script with require or include. If calling directly we return code othewise we return the etag
representing the latest files
*/
if (isset($_GET['version'])) {
$iETag = (int)$_GET['version'];
$sLastModified = gmdate('D, d M Y H:i:s', $iETag).' GMT';
// see if the user has an updated copy in browser cache
if (
(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $sLastModified) ||
(isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $iETag)
) {
header("{$_SERVER['SERVER_PROTOCOL']} 304 Not Modified");
exit;
}
// create a directory for storing current and archive versions
if (CREATE_ARCHIVE && !is_dir("$sDocRoot/".ARCHIVE_FOLDER)) {
mkdir("$sDocRoot/".ARCHIVE_FOLDER);
}
// get code from archive folder if it exists, otherwise grab latest files, merge and save in archive folder
if (CREATE_ARCHIVE && file_exists("$sDocRoot/".ARCHIVE_FOLDER."/$iETag.cache")) {
$sCode = file_get_contents("$sDocRoot/".ARCHIVE_FOLDER."/$iETag.cache");
} else {
// get and merge code
$sCode = '';
$aLastModifieds = array();
foreach ($aFiles as $sFile) {
$aLastModifieds[] = filemtime("$sDocRoot/$sFile");
$sCode .= file_get_contents("$sDocRoot/$sFile");
}
// sort dates, newest first
rsort($aLastModifieds);
if (CREATE_ARCHIVE) {
if ($iETag == $aLastModifieds[0]) { // check for valid etag, we don't want invalid requests to fill up archive folder
$oFile = fopen("$sDocRoot/".ARCHIVE_FOLDER."/$iETag.cache", 'w');
if (flock($oFile, LOCK_EX)) {
fwrite($oFile, $sCode);
flock($oFile, LOCK_UN);
}
fclose($oFile);
} else {
// archive file no longer exists or invalid etag specified
header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found");
exit;
}
}
}
// send HTTP headers to ensure aggressive caching
header('Expires: '.gmdate('D, d M Y H:i:s', time() + CACHE_LENGTH).' GMT'); // 1 year from now
header('Content-Type: '.FILE_TYPE);
header('Content-Length: '.strlen($sCode));
header("Last-Modified: $sLastModified");
header("ETag: $iETag");
header('Cache-Control: max-age='.CACHE_LENGTH);
// output merged code
echo $sCode;
} else {
// get file last modified dates
$aLastModifieds = array();
foreach ($aFiles as $sFile) {
$aLastModifieds[] = filemtime("$sDocRoot/$sFile");
}
// sort dates, newest first
rsort($aLastModifieds);
// output latest timestamp
echo $aLastModifieds[0];
}
?>