Реализация на PHP

После разделения JavaScript- и CSS-кода по файлам для поддержания модульной структуры можно в контроллере создать список файлов, которые надо присоединить к данному документу (вместо того чтобы прописывать это вручную в шаблоне отображения). Но теперь надо сделать так, чтобы до показа шаблона вызывалась функция кэширования, которая проходилась бы по списку, проверяла из него локальные файлы на время изменения, объединяла в один файл и создавала или перезаписывала gz-файл с именем, сформированным из md5-хэша имен входящих файлов.

В качестве рабочего примера можно привести следующую функцию:

function cache_js(){
        $arrNewJS=array();
        $strHash='';
        $strGzipContent='';
        $intLastModified=0;

// проходимся по списку>файлов
       foreach ((array)$this->scripts as $file){
               if (substr($file,0,5)=='http:') continue;
               if ($file[0]=='/') $strFilename=sys_root.$file;
               else $strFilename=sys_root.'app/front/view/'.$file;
               $strHash.=$file;

// читаем содержимое в одну строку
               $strGzipContent.=file_get_contents($strFilename);
               $intLastModified=$intLastModified<filemtime($strFilename) ?
                 filemtime($strFilename) : $intLastModified;
        }
        $strGzipHash=md5($strHash);
        $strGzipFile=sys_root.'app/front/view/js/bin/'.$strGzipHash.'.gz';

// проверяем, надо ли перезаписать gz-файл
        if (file_exists($strGzipFile) && $intLastModified>filemtime($strGzipFile) || !file_exists($strGzipFile)){
               if (!file_exists($strGzipFile)) touch($strGzipFile);

// используем функции встроенной в php библиотеки zlib для архивации
               $gz = gzopen($strGzipFile,'w9');
               gzputs ($gz, $strGzipContent);
               gzclose($gz);
        }

// перезаписываем список на один файл
        $arrNewJS[]='js/bin/'.$strGzipHash.'.gz';
        $this->scripts=$arrNewJS
}

Для CSS основные теоретические моменты описаны выше, а реализация даже несколько проще. Если использовать YUI Compressor, то решение будет совершенно одинаково (вычислили зависимости, склеили файлы, сжали, переименовали, сделали архив) для обоих типов файлов.