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

PHP Speedy

К сожалению, почти все описанные выше методы применимы только на стадии разработки или существенной оптимизации и требуют участия опытных разработчиков для своей интеграции. Но возникает резонный вопрос: может быть, уже существуют какие-либо автоматизированные решения для автоматического объединения CSS- или JavaScript-файлов? И что делать, если хочется ускорить сайт на существующей платформе одной из популярных CMS, где в коде уже «сам черт ногу сломит»?

В таких случаях можно использовать проект с открытым кодом PHP Speedy ( http://aciddrop.com/php-speedy/ ) — РНР-скрипт, который обеспечивает расширенное кэширование и сжатие компонентов страницы, не требуя никаких модификаций вручную. Достаточно только установить скрипт на сервере и сделать несложные настройки, заключающиеся в указании директории с самим сайтом и папок для кэширования файлов. Скрипт умеет автоматически склеивать все CSS- и JavaScript-файлы, кэшировать их, применяет оптимизацию (с помощью пакета Minify, http://code.google.com/p/minify/ , о котором уже шла речь выше), а также gzip-сжатие. На выходе мы получаем автоматическую оптимизацию сайта совершенно бесплатно. Хотя, конечно, не следует рассматривать это как конец — для начала такое решение вполне приемлемо, однако, для достижения максимальной производительности сайта придется со временем все больше и больше настраивать некоторые моменту вручную и применять советы из этой книги.

Для владельцев блогов на популярном движке WordPress есть специальное расширение на основе этого решения, добавляющее оптимизацию буквально одним кликом в панели управления. Решение очень даже полезное: блоги часто расположены на слабых хостинговых площадках, а популярность проекта может возрасти буквально после пары публикаций. Площадка может быть к этому просто не готова, да сам WordPress не является вершиной оптимизации с точки зрения нагрузки.

Posted in Разгони свой сайт.