Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Extensions > GZIP сжатие


Автор: deMike 31.7.2006, 17:16
Подскажите пожалуйста как сделать вывод данных на странице через GZIP сжатие? 

Автор: AztEK 31.7.2006, 17:26
1) Что тема делает в "Профессиональной разработке"??
2) Обсуждалось миллион раз. Юзай поиск.
3) Я делаю так:
Код

// $contents - содержимое страницы. Можно через ob_ функции
if(!(headers_sent() || connection_aborted() || in_array('gzcompress', get_defined_functions())))
{
    if(strpos(getenv('HTTP_ACCEPT_ENCODING'), 'x-gzip') !== false)
    {
        $encoding = 'x-gzip';
    }
    elseif(strpos(getenv('HTTP_ACCEPT_ENCODING'), 'gzip') !== false)
    {
        $encoding = 'gzip';
    }
    else $encoding = false;
            
    if($encoding)
    {
        header('Content-Encoding: ' . $encoding);
        echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
        $contents = gzcompress($contents, 3); // 3 - уровень сжатия (3 имхо оптимально)
        echo substr($contents,  0,  strlen($contents) - 4) . pack('V', crc32($contents)) . pack('V', strlen($contents));
    }
    else echo $contents;
}
else
{
    echo $contents;
}
 

Автор: deMike 31.7.2006, 19:35
Браузер пишет такую штуку: Возникла проблема при декодировании данных. Возможно, в связи с повреждением данных. 

Автор: GiV 31.7.2006, 19:43
Фарволы не портят ничего?

Попробуйте от сюда: http://www.php.net/ob-gzhandler (см комментарии) 

Автор: GZep 16.8.2006, 17:25
Вот как делай:

в самом начале скрипта
Код

<?php
$start_time = microtime(true);
function ob_saveCookieAfter($s) {
    setcookie("page_size_after", strlen($s));
    return $s;
}
function ob_saveCookieBefore($s) {
    setcookie("page_size_before", strlen($s));
    return $s;
}
ob_start("ob_saveCookieAfter");
ob_start("ob_gzhandler", 9);
ob_start("ob_saveCookieBefore");
?>

в месте вывода статистики код на java script
Код

<script language="JavaScript" type="text/javascript">
<!--
function getCookie(name) {
    var p = name + "=";
    var si = document.cookie.indexOf(p);
    if (si == -1)
        return null;
    var ei = document.cookie.indexOf(";", si + p.length);
    if (ei == -1)
        ei = document.cookie.length;
    return unescape(document.cookie.substring(si + p.length, ei));
}
var size_before = getCookie("page_size_before");
var size_after = getCookie("page_size_after");
var gen_time = getCookie("page_gen_time");
if (gen_time) {
    document.write("[Сгенерировано за: " + gen_time + " секунды] ")
} else {
    document.write("[Невозможно узнать время генерации скрипта] ");
}
if (size_before && size_after) {
    document.write("[GZip: " + size_after + "b/" + size_before + "b (" + (100-Math.round(size_after/size_before*100))+"%)]")
} else {
    document.write("[GZip выключен]");
}
// -->
</script>

следующая строчка должна быть последней
Код

<? setcookie ("page_gen_time", sprintf('%.5f', microtime(true) - $start_time)); ?>




Вот и все! спасибо хотяб скажи, если, конечно, понравится. или проголосуй.... smile 
Удачи!

Автор: GZep 30.8.2006, 14:44
Кстати, что, фаервол может обломать GZip?

Если так, то это плёхо...... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)