• Є купа рад як прискорити віддачу сайту - це і статика через nginx і групування і ще купа всіляких хитрих технологій. Однак у всіх книжках, советующих як можна підвищити завантаження сайтів можна знайти дві постійно повторюються теми - «склеювання CSS/JS» і «включення стиснення».
    Склейка
    Все просто - якщо, наприклад, у Вас на сторінці 3 файлу CSS і 5 JS, браузеру при завантаженні доведеться створювати 8 з'єднань і викачувати з ним дані, а як відомо, краще кілька великих файлів ніж безліч дрібних. Пов'язано це з тим, що на кожну встановлення з'єднання браузер витрачає час і часто немаленьке - до 40% часу завантаження.
    Стандартні методи написати якийсь командний файл, який пробегался б по потрібних файлів і склеював їх в один мені не подобалися в принципі, бо робити ручками речі, які можна зробити автоматично в корені не вірно, в даному випадку хоча б з того, що це позначається або на розробці, або на продакшені (додаткові дії).
    Як кажуть «ніколи не переписуйте те, що можна просто вирізати і вставити» ;)
    Стиснення
    Чим менший обсяг «прокачувати» файлів, тим відповідно менше часу витрачається на завантаження. Навіть якщо ці файли стиснуті і ми витрачаємо некторое час на розпаковування - при сучасних обчислювальних потужностях на клієнті ця тимчасова витрата практично не существенна.Большинство сучасних браузерів підтримують метод стиснення deflate, іноді званий gzip по імені стандартної *nix утиліти, що здійснює це справу.
    Що можна і потрібно стискати в веб? Будь-які текстові запити, як то: JS / CSS / JSON / HTML.
    Є чудовий модуль для Апача mod-deflate, яким можна прямо з .htaccess вказати чого стискати і чого не стискати, дуже простий у використанні, але на жаль і ах! - зазвичай заборонений на стандартних хостингах унаслідок того, що вони (хостери) побоюються за своє процесорний час.
    Частка розумного в цьому звичайно є - цей модуль тисне все «на льоту» і якщо не вжити деяких хитрощів, кожен раз shipping сторінку для нового користувача він будетзаново перетискати всі CSS / JS і т.д.
    Якщо ж у вас VDS і Ви - сам собі хазяїн - використовуйте mod-deflate, бо він добре налагоджений і прикладів застосування в мережі маса.
    А ми повернемося до звичайних хостигам - чи є вихід? Навіть якщо Вас з'їли, у вас завжди є два виходи - є вихід і тут. Причому це завдання дуже добре лягає на попередню - зараз поясню чому.
    Більшість JS / CSS та інших текстів - це статика, тобто вони не змінюються в процесі функціонування сайту - є сенс їх об'єднати, щоб задовольнити пункту про «склейці» + відразу ж стиснути.
    Отримані файли ми покладемо в якийсь кеш, звідки наш Апач буде їх брати й віддавати. Причому процес автоматизуємо через mod-rewrite.
    Алгоритм вийде приблизно такий:
    запитується якийсь файл зі спеціального URL
    якщо клієнт підтримує стиснення і стиснений файл такого типу є в нашому сервері - віддаємо і завершуємо обробку
    якщо ж стиск не підтримується і є просто файл такого типу - віддаємо його і закінчуємо обробку
    інакше запускаємо наш обробник
    Умовимося, що спрацьовувати наша модель при зверненні до URLу виду «/glue/….»,
    А файли будуть лежати в «/static/glue/…».
    В даному випадку ми вбиваємо ще одного зайця - файли будуть віддаватися через PHP всього один раз - при формуванні, а далі буде все як у великих :) статику має і буде віддавати веб сервер.
    У принципі можна зробити так, щоб папка збігалася з URL-ом, тоді трохи спроститься конфіг mod-rewrite але буде не так цікаво, вобщем спростити завжди можна :)
    Сподіваюся, що в корені Вашого сайту вже живе файл .htaccess з вмістом такого типу:
    RewriteEngine On
    RewriteBase /
    RewriteRule ^.*$ index.php [QSA,L]

    Ну або схожий. Основна умова, що якщо mod-rewrite не знайшов чого зробити з прийшли URL, він врешті-решт викличе якийсь скриптова файл.В даному випадку - index.php
    Для додавання нашого алгоритму пропишемо в.htaccess наступне:
    Додаємо підтримку стислих файлів .gz, а також .jz.gz і .css.gz
    AddEncoding gzip .gz
    < FilesMatch "\\.js.gz$">
    #для проксей
    Header set Cache-control: private
    Header append Vary User-Agent

    ForceType "text/javascript"
    Header set Content-Encoding: gzip
    AddCharset windows-1251 .js.gz
    < /FilesMatch>
    < FilesMatch "\\.css.gz$">
    #для проксей
    Header set Cache-control: private
    Header append Vary User-Agent

    ForceType "text/css"
    Header set Content-Encoding: gzip
    < /FilesMatch>
    Додаємо правило віддачі наших файлів (разыменовывание URL в фізичну папку)
    RewriteCond %{ENV:REDIRECT_GZ} =1
    RewriteCond %{REQUEST_URI} ^/glue/(.+)$
    RewriteCond %{DOCUMENT_ROOT}/static/glue/%1-f
    RewriteRule . - [L]
    Додаємо перевірку на підтримку клієнтом стиснення
    RewriteCond %{REQUEST_URI} ^/glue/(.+)$
    RewriteCond %{DOCUMENT_ROOT}/static/glue/%1.gz -f
    RewriteCond %{HTTP:Accept-Encoding} ^.*?gzip.*$ [NC]
    RewriteCond %{HTTP_USER_AGENT} !^konqueror [NC]
    RewriteRule ^siteglue/(.*)$ /static/glue/$1.gz [L,E=GZ:1]
    Якщо стиснення не підтримується
    RewriteCond %{REQUEST_URI} ^/glue/(.+)$
    RewriteCond %{DOCUMENT_ROOT}/static/glue/%1-f
    RewriteRule . static/glue/%1 [L,E=GZ:1]
    Тепер візьмемося за нашу найголовнішу магію - автоматичне формування цих самих файлів.
    Тут є ще одна хитрість, в цьому випадку скоріше - ще одна умовність - у файлах html ми будемо писати запити до css або js в следующтим вигляді:«/glue/1.css-2.css-3-4-5. css», де «-» - це заміна «/», «--» - це розділювач файлов.Кроме того імена можуть бути тільки англійські букви, цифри та символ «_», на мене - це більше, ніж достатньо.
    Звичайно ж, це умовності і Ви можете вибрати собі інші правила та інші роздільники. Наприклад можна використовувати «,» або що ще.
    Однак я вибрав «-» з-за те що це цілком нормальний і часто зустрічається символ URL і з них навряд чи можуть бути всілякі дурні проблеми типу вирізання його кривими скриптами на проксях по дорозі від Вас до клієнта.
    у файлі В index.php (або що там у вас запускається згідно .htaccess?) додаємо оброблювач, який перевіряє URL на відповідність нашому «/glue/.*» і в разі збігу робить echo( Glue::generate( $str ) ), де $str - те, що у нас йде в URL після останнього слеша, тобто для «/glue/a.js» це буде «a.js»
    Сам клас Glue ось такий
    class Glue {
    static $allowedExt = array(
    "js" => array( "check" => "/^js/.*?.js$/", "delimeter" => ";n", "mime" => “text/javascript”),
    "css" => array( "check" => "/^css/.*.css$/", "delimeter" => "n", "mime" => “text/css” ),
    );
    static function generate( $str ) {
    якщо ( !$str ) return null; //не знайшли URL

    $files = array();
    preg_replace( "/((?:[a-z0-9_.]+-)+[a-z0-9_.]+.([a-z0-9]+))(?:--|$)/ie", "$files[]=str_replace( -, /, "1\ &$fd["delimeter"];
    foreach( $files as $name ) {
    $ext = substr( strrchr( $name, . ), 1 );
    if (
    $ext === false ||
    in_array( $name, $usedNames ) ||
    $ext != $cext ||
    !preg_match( $fdC, $name )
    ) return null; //не змогли знайти розширення, файл ч таким ім'ям вже є або розширення відрізняється від первісного або ім'я не задовольняє перевірці
    $usedNames[] = $name;
    $filec = file_get_contents( "{$srcF}/{$name}" );
    якщо ( !$filec ) return null; //не змогли знайти або прочитати файл
    $content .= $content != "" ? $fdD . $filec : $filec;
    }
    //зберегли файл
    file_put_contents( "{$dstF}/{$str}", $content );
    //зберегли стиснений файл
    $gzip = gzencode( $content, 9 );; //gzdeflate( $content, 9 );
    if ( $gzip ) file_put_contents( "/{$dstF}/{$str}.gz",$gzip );

    //ми повинні віддати за цим запитом вміст і mime-тип
    header( "Content-type: " . $fd["mime"], true );
    return $content;
    }
    }
    Знову ж таки, тут лише ілюструється один зі способів зробити це - не подобається статичний клас - Ви можете вибрати будь-який інший спосіб - з блекджек і дамами не важкого поведінки ;)
    От у принципі все, залишилося пробігтися по файлів проекту - все ж таки залишився шматочок «ручний» роботи :( - і прописати замість купи один скриптів, але за правилами, описаним трохи Вище.
    Все - при першому запиті автоматично всі збереться і почне віддаватися.
    Ще одне маленьке доповнення - а що робити з контентом, отдаваемым PHP?Його теж треба стиснути!
    Для цього в той місці де Ви віддаєте файли текстового виду, там де віддається сформований контент - наприклад так echo( $content );
    Зробити наступне:
    if ( isClientSupportGzip() ) {
    ob_start("ob_gzhandler\ скэшируется, браузером.
    При склейці JS пам'ятайте особливість - склеювати треба через «;», оскільки в попередньому файлі після останнього рядка може не виявитися «;»
    При написанні обробника формування кешу пам ’ ятайте про хакерів - перевіряйте все і вся, за невдалого екранування можна насклеивать і отримати як статики багато чого цікавого, на худий кінець можна шляхом перебору насмерть засрать Вам дисковий простір, так що навіть містер Пропер не допоможе - акуратніше вобщем.
    Якщо у Вас сайт в самій непопулярною кодуванні, щоб все було шоколадно, заменитеForceType «text/javascript» на ForceType «text/javascript; content=windows-1251»і додайте: AddCharset windows-1251 .js і AddCharset windows-1251 .css
    І ще маленький рада, дотримуйтеся однаковою черговості у вказівці що склеюються файлів, бо технічно «/glue/a.js-b.js» і «/glue/b.js-a.js» це одне і теж, а на практиці ви отримаєте два файли в кеші…