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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отдать сжатый файл так, чтобы браузер, его расжал сам(gzip) 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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