Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отдать сжатый файл так, чтобы браузер, его расжал сам(gzip) 
:(
    Опции темы
sergejzr
Дата 16.12.2005, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Привет, гуру ПХП. Проблема - не проблема, идея - не идея, короче мысль...

Если гзиппить страничку и посадть правильный header, то браузер после скачивания сам распакует её и покажет.

Теперь предположим у меня есть увесистый яваскрипт. Гзиппить каждый раз при отдаче - мало смысла. Бесполезная нагрузка на сервер просто. Мысль такая - хранить сжатый файл параллельно и просто отдавать его, если браузер понимает гзип, иначе отдавать внутренности несжатого файла.

Это всё дожно работать для клиента как обыкновенный скрипт. В том числе возвращать Not modified, когда надо итд.

Я кое чего пробовал, но с файлом не получилось... Вопрос - может кто занимался этим. Скрипты редко меняются, гзиппить легко, а таким способом можно съэкономить кучу траффика.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
CyClon
Дата 17.12.2005, 22:04 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Мне бы еще почитать что такое gzip то есть зачем оно и толку... Ну и способы применения...


--------------------
user posted image
PM   Вверх
Mal Hack
Дата 17.12.2005, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



sergej.z а просто использовать зипование на уровне сервера через mod_deflate не пробовал?
PM ICQ   Вверх
sergejzr
Дата 18.12.2005, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(Mal @ 17.12.2005, 21:20)
sergej.z а просто использовать зипование на уровне сервера через mod_deflate не пробовал?

Втом то и прикол, что так работает, но разве имеет смысл постоянно зипповать не меняющиеся файлы заного?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mal Hack
Дата 18.12.2005, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(sergej @ 18.12.2005, 21:14)
Втом то и прикол, что так работает, но разве имеет смысл постоянно зипповать не меняющиеся файлы заного?

А разве он будет его каждый раз зиповать, и не кэширровать (уже клиент)
PM ICQ   Вверх
sergejzr
Дата 18.12.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Здесь про сервер вопрос. Про клиента мы ничего не знаем, нам и неинтересно. Ктото кэширует кто-то нет. Любое сжатие такого файла чаще одного раза не оптимально.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mal Hack
Дата 18.12.2005, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Проще забить на тех, кто не понимает гзип и всегда отдавать сжатый.
PM ICQ   Вверх
sergejzr
Дата 19.12.2005, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Но ведь это не должно быть сложным. гзиповать строку и отдать или зачитать из файла и отдать..


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mal Hack
Дата 19.12.2005, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



sergej.z а я тут подумал. А что если один раз пропустить файлик через буферизацию и ob_gzhandler, а затем просто добавлять его к выводу через туже буферизацию?
PM ICQ   Вверх
sergejzr
Дата 19.12.2005, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Хмм.. я незнаком с буфферизацией к сож.. как это? Где можно почитать?
Вот кстати Гирдер ссылку дал по теме http://cssing.org.ua/2005/04/07/gzipping-your-css/
Вприн7ципе так я уже делал давно. Но это сжатие "onthefly"


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mal Hack
Дата 19.12.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



PM ICQ   Вверх
Wowa
Дата 28.12.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



sergej.z получилось что-нибудь?
PM WWW   Вверх
sergejzr
Дата 28.12.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Надо ещё разобраться - времени нет. Может кто попробует?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
wsr
Дата 8.1.2006, 01:07 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Fuzzy Logic
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 3.7.2005

Репутация: нет
Всего: 2



sergej.z. Делать за тебя сдесь никто ничего не будет! Тебя только направят на правильный путь! И если где баги... помогут!

Есть другой вариант!
Создать так сказать дополнительное кеширование!
Т.е. по URI данным узнаем уникальное имя файла! смотрим дату его последней модификации!
Если прошло не так много времени, то выводим инфру из файла, не гоняя скрипт!
А если время кеширования прошло, то пишем данные в файл и выводим их пользователю!
Так получим минимум для генерации странички!

Удачи!
Добавлено @ 01:08
При этом как раз используем ob_start('gz_handler')
--------------------
 ICQ : 918-318Сайт : Lock-Team 
PM MAIL WWW ICQ   Вверх
Greendrake
Дата 28.9.2006, 09:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: 1
Всего: 6



Вроде сделал.

gz.php:
Код

<?

include('../inc/config.php');
$file = dirname(__FILE__).'/'.(isset($_GET['f'])?$_GET['f']:'');
if (!isset($_GET['f']) || empty($_GET['f']) || !file_exists($file)){
  header("HTTP/1.1 404 Not Found");
  exit;
};
header('Content-Type: '.mime_content_type($file)); 
if (OUT_ZIP == 1 && strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false) {
  $zFile = ROOT.'/ref/temp/'.md5_file($file);
  if (!file_exists($zFile)){
    $zFileHandler = fopen($zFile,"w");
    fwrite($zFileHandler,gzencode(file_get_contents($file),9));
    fclose($fp);
  };
  $file = $zFile;
  header('Content-Encoding: gzip');
};
header('Content-Length: '.filesize($file));
header('Connection: close');
readfile($file);

?>


.htaccess:
Код

RewriteEngine on
RewriteRule ^gz_(.+)$ gz.php?f=$1


Так, если хотим экономить трафик и быстрее загружать, вместо привычного common.js запрашиваем gz_common.js. Скрипт проверит, нет ли во временной папке файла с именем, соответствующим md5('common.js'). Если нету, он его там создаст (запишет туда сжатый common.js). Ну и отдаёт его, соответственно, со всеми заголовками. Если сжатие отключено, или браузер не понимает сжатый контент — на нет и суда нет, отдаём common.js как есть.
PM MAIL   Вверх
Greendrake
Дата 4.10.2006, 17:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: 1
Всего: 6



В процессе тестирования более усовершенстваванной версии скрипта — отдающей заголовки Last-Modified и ETag и проверяющей в запросе заголовки If-None-MatchIf-Modified-Since, и отдающей при необходимости 304 Not Modified, столкнулся с проблемой в IE: когда сервер отдаёт сжатый файл, при последующих запросах IE не добавляет ни заголовок If-None-Match, ни If-Modified-Since. Соответственно, на повторные запросы IE, сервер всегда отдаёт тело файла, даже если файл не изменился — т. е. всё время гонится ненужный траф. Если сжатие отключить — проблема исчезает, IE начинает вставлять в повторные запросы заголовок If-None-Match. В FF всё работает отлично и в случае сжатия и в случае без.
Пробовал персонально для IE кидать Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0 — не помогает smile.


---------------------------------------------------------------
Нашёл пару статей на эту тему: однавторая. Это баг IE.

Вывод: для IE не стоит сжимать файлы, вставляемые в каждую веб-страницу на сайте (css, js etc.). Ибо он будет их скачивать при каждом запросе, хоть и сжатые. Уж лучше пусть скачает несжатые, но один раз. Исключение — сайты на AJAX, где не происходит то и дело обновлений страниц.

Это сообщение отредактировал(а) Greendrake - 4.10.2006, 21:28
PM MAIL   Вверх
sunkitten
  Дата 5.8.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Greendrake, будьте добры показать Ваш усовершенствованный скрипт.
Прошу прощения за реанимацию темы, но дело в том, что без сжатия в наше время увесистых css файлов и JS-фреймворков никуда.

Я до селе использовал механизм, взятый не помню откуда, с какого-то забугорного блога (см. листинг ниже). Но он почему то отказывается работать на моем новом хостинге (на старом стоял PHP-4 а на новом PHP-5). Даже тестируя на "Денвере" с 4-м PHP всё хорошо работает.
Посмотрите этот код, возможно увидите причину, почему он не работает.

файл .htaccess
Код

RewriteEngine on
RewriteBase /
RewriteRule ^images/(.*\.css) /compress_js_css.php?type=css&files=$1
RewriteRule ^images/(.*\.js) /compress_js_css.php?type=javascript&files=$1


И собственно файл compress_js_css.php:
Код

<?
        $cache           = true;
        $cachedir = dirname(__FILE__) . '/cache';
        $cssdir   = dirname(__FILE__) . '/css';
        $jsdir    = dirname(__FILE__) . '/javascript';

        // Determine the directory and type we should use
        switch ($_GET['type']) {
                case 'css':
                        $base = realpath($cssdir);
                        echo $base;
                        break;
                case 'javascript':
                        $base = realpath($jsdir);
                        echo $base;
                        break;
                default:
                        header ("HTTP/1.0 503 Not Implemented");
                        exit;
        };

        $type = $_GET['type'];
        $elements = explode(',', $_GET['files']);
       
        // Determine last modification date of the files
        $lastmodified = 0;
        while (list(,$element) = each($elements)) {
                $path = realpath($base . '/' . $element);
       
                if (($type == 'javascript' && substr($path, -3) != '.js') || ($type == 'css' && substr($path, -4) != '.css')) {
                        header ("HTTP/1.0 403 Forbidden");
                        exit;       
                }
       
                if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
                        header ("HTTP/1.0 404 Not Found");
                        exit;
                }
               
                $lastmodified = max($lastmodified, filemtime($path));
        }
       
        // Send Etag hash
        $hash = $lastmodified . '-' . md5($_GET['files']);
        header ("Etag: \"" . $hash . "\"");
       
        if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
                stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"')
        {
                // Return visit and no modifications, so do not send anything
                header ("HTTP/1.0 304 Not Modified");
                header ('Content-Length: 0');
        }
        else
        {
                // First time visit or files were modified
                if ($cache)
                {
                        // Determine supported compression method
                        $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
                        $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
       
                        // Determine used compression method
                        $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
       
                        // Check for buggy versions of Internet Explorer
                        if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') &&
                                preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
                                $version = floatval($matches[1]);
                               
                                if ($version < 6)
                                        $encoding = 'none';
                                       
                                if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1'))
                                        $encoding = 'none';
                        }
                       
                        // Try the cache first to see if the combined files were already generated
                        $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');
                       
                        if (file_exists($cachedir . '/' . $cachefile)) {
                                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {

                                        if ($encoding != 'none') {
                                                header ("Content-Encoding: " . $encoding);
                                        }
                               
                                        header ("Content-Type: text/" . $type);
                                        header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
               
                                        fpassthru($fp);
                                        fclose($fp);
                                        exit;
                                }
                        }
                }
       
                // Get contents of the files
                $contents = '';
                reset($elements);
                while (list(,$element) = each($elements)) {
                        $path = realpath($base . '/' . $element);
                        $contents .= "\n\n" . file_get_contents($path);
                }
       
                // Send Content-Type
                header ("Content-Type: text/" . $type);
               
                if (isset($encoding) && $encoding != 'none')
                {
                        // Send compressed contents
                        $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
                        header ("Content-Encoding: " . $encoding);
                        header ('Content-Length: ' . strlen($contents));
                        echo $contents;
                }
                else
                {
                        // Send regular contents
                        header ('Content-Length: ' . strlen($contents));
                        echo $contents;
                }

                // Store cache
                if ($cache) {
                        if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
                                fwrite($fp, $contents);
                                fclose($fp);
                        }
                }
        }       
?>


Очень нуждаюсь в решении данной задачи.
Благодарен за комментарии.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.