Реализация на 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, то решение будет совершенно одинаково (вычислили зависимости, склеили файлы, сжали, переименовали, сделали архив) для обоих типов файлов.
Дата добавления: 2015-05-19; просмотров: 764;