Еще раз про GZip сжатие страниц и кеширование

Почитал я тему Сжатие страниц LiveStreet на лету / Tips & tricks и подумал, что человек уж больно сильно убился на написание сего корявого кода.
Не мне судить над ровностью кода, скорее модераторам модулей.
Так вот о чем я. Поразмыслил тут и отписался в камментах. Но чтоб народу-то донести, т.к. многим более информативнее топик вместо камментов читать, публикую свои мысли здесь.

Зачем писать весь этот бред? делаем проще, лол =)
в index.php после
21: header('Content-Type: text/html; charset=utf-8');

пишем
22: ob_start('ob_gzhandler');

Либо просто, если имеем доступ, выставляем в php.ini в примерно 126 линии:
zlib.output_compression = On
zlib.output_compression_level = -1


и готово. что касается самих js/css файлов.


тут тоже ничего страшного нет:
создаем файл index2.php и в нем пишем следующее:
<?php
    ob_start('ob_gzhandler');
    $file_type = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '?')-3, 3);
    if($file_type == 'css') $file_type = 'text/css';
    elseif($file_type == '.js') $file_type = 'text/javascript';
    else $file_type = 'text/plain';

    if(file_exists(getcwd(). $_SERVER['REQUEST_URI']))
        $output = file_get_contents(getcwd(). $_SERVER['REQUEST_URI']);
    else die(header('location: /'));

    // ну и конечно же кеш для статики
    $expires = 3600*24*30;
    header("Pragma: public");
    header("Cache-Control: maxage=".$expires);
    header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
    header('Content-type: '.$file_type);

    die($output); // отдаем скриптом, чтобы ob_gzhandler смог сжать выход.
сюда можно еще многое добавить, например вырезать из output пустые строки и/или перевод каретки и/или комментарии:
$output = preg_replace('#\/\*(.*)\*\/#', '', $output);
$output = preg_replace('#\/\/(.*)#', '', $output); 
в данном виде эти две строки врятли будут работать, я лишь хотел показать что я имею ввиду. просто нет времени писать сложные регулярки, кто силен тот можете отписаться

для того чтобы вся эта кострукция заработала, нам необходимо весь css, js траффик пустить через index2.php. Делается это так:
RewriteRule ^(.*)\.(css|js)$    index2.php [L]


Вставить необходимо сразу под
RewriteEngine On
и вот что у нас получилось:


Главная фишка моего подхода заключается в том, что у меня страницы грузятся если человек находится за проксей, а представленное решение топикстартера не позволяет этого сделать ссылаясь на HTTP_TE какое то…

результат работы строки
22: ob_start('ob_gzhandler');






есть еще один момент чтобы ускорить работу сайта. в .htaccess можно добавить
ExpiresActive On
ExpiresDefault a5356800
ExpiresByType image/x-icon image/jpeg image/gif image/png a5356800
ExpiresByType application/x-javascript a5356800
ExpiresByType text/css a5356800
ExpiresByType text/html a5356800
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
   ExpiresActive Off
</FilesMatch>


Это кеширование по типу файла, очень хорошая вещь для массового браузерного кеша.

p.s. и, уважаемые программисты, не ставьте знак ?> в конце файла, это сэкономит не только размеры файлов, но и многие часы дебага

p.s.s в данный момент подготавливаю большой модуль «галерея изображений». Аналог галереи в вордпресс. В своем блоге я часто использую картинки для отображения заголовка статьи, например, статья об extjs всегда начинается с логотипа Extjs. В данный момент каждый раз для новой статьи загружается отдельный экземпляр одного и того же изображения. Когда можно использовать одно и то же изображение 1 раз, что сильно увеличит скорость загрузки контента. ждите…
ну и если топик не заминусуют, то, как закончу, выложу в доступ шаблон в стиле ">extjs.

8 комментариев

avatar
Занимаетесь настройкой ls и может даже vps в вопросах кеширования, сжатия и подобных для увеличения производительности сайта в целом? Что-то из этого?
avatar
конкретно этим не занимаюсь, но имею большой опыт во многих местах разработки.
avatar
А что будет с клиентами, не поддерживающими сжатие?
avatar
ob_gzhandler() предназначена для использования в качестве callback-функции для ob_start(), чтобы облегчить отправку gz-кодированных данных web-браузерам, поддерживающим сжатие web-страниц. Прежде чем ob_gzhandler() отправит сжатые данные, она определяет, какой тип кодирования содержимого принимает браузер («gzip», «deflate» или вообще никакое), и возвратит его содержимое соответствующим образом. Поддерживаются все браузеры, отправляющие корректную шапку/header о том, что они принимают сжатые web-страницы.
avatar
Спасибо, очень полезная штука

P.S сайт у вас тоже оказался полезным
  • pskk
  • 0
avatar
Все что вы тут так старательно описали, морально устарело и очень не актуально… От этого была бы польза много лет назад, чуть ли не в прошлом веке…

1. Зачем нагружать то что и так чаще всего является узким местом, а именно апликейшен часть?
2. Операция сжатие довольно ресурсоемкая, поэтому логичней держать все сжатым и распаковывать при необходимости…

Вот примерный список чего можно сжимать:
text/plain text/html text/xml text/css text/x-component application/x-shockwave-flash text/rtf application/x-javascript application/msword application/vnd.ms-excel application/vnd.ms-powerpoint


Expires тоже не плохая штука, но ставить такие сроки не правильно, правда уже не вспомню почему и искать времени нету…
avatar
Прописал все вышесказанное к 0.4.2
Результат нулевой…
Посмотрел через Page Speed строчку про gzip не нашел.
Возможно что-то не так сделал?
RewriteRule ^(.*)\.(css|js)$    index2.php [L]
прписываем, как я понимаю в .htaccess?
avatar
Да, в .htaccess
У меня на LS 0.4.2 rev.1214 всё отлично работает.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.