Всё таже gzip компрессия :( Раз и навсегда.

col

Guest
Всё та же gzip компрессия :( Раз и навсегда.

Граждане гуру.
Я честно перечитал все темы на форуме по сабжу и добрых 2 ночи рыскал в нете но без результатно :(
Я хочу еще раз поднять эту тему, но отличие её от все что тут есть, это то что я не спрашиваю решение какой-то конкретной проблемы, я прошу обьяснить так сказать с нуля и до конца.

КАК СДЕЛАТЬ КОМПРЕССИЮ НА ЛЕТУ(Я ПОДРАЗУМЕВАЮ ZIP)

1. что для этого надо.
2. конкретый пример, который будет работать если его скопировать и запуситить.
3. как это проверить.
----------------------------------------------------------------------
Теперь мои комментарии. Я слышал что это можно делать двумя способами. При помощи PHP и Apache. Когда я скопировал пример и мануала php
<?php

ob_start("ob_gzhandler");

?>
<html>
<body>
<p>This should be a compressed page.
</html>
<body>
то это не заработало :(. А для апача я так модуля и не нашел. На сайте ссыла запората.

Второе это так тоже мои рассуждения. Нераз копаясь в кеше IE я находил там zip входя в которые я обнаруживал там htm css и прочую дребедень - это и есть эфект исспользования zip компрессии.

Третье. я вас очень прошу давать ссылы на английские доки только в крайнем случае так как с ними у меня не важно :(

Четвертое. Уважаемые еще раз оговорюсь я не создал эту тему только из-за того что мне лень искать я рыскал как волк :)
просто полного исчепающего ответа в одном месте я не нашел. Ведь лучше один раз хорошенько постараться и решить эту проблему раз и на всегда чем раз в месяц получать похожие темы. Я стараюсь не только для себя, но также и для остальных непросвещенных и в некоторой мере для модеров, чтоб они больше не затруднялись ответами на схожие темы.

Я призываю вас дать полный исчерпывающий ответ. Что то вроде знаменитой доки про, то как ставить Apache+php+perl+mysql. Так что бы после прочтения темы ничего не оставалось только как сделать все правильно.

С уважением CoL.
 

tony2001

TeaM PHPClub
>КАК СДЕЛАТЬ КОМПРЕССИЮ НА ЛЕТУ(Я ПОДРАЗУМЕВАЮ ZIP)
компрессию ЧЕГО ?

>это не заработало
надо думать, что это текст ошибки.
или подробное объяснение проблемы.
почему ты так решил?

>Я призываю вас дать полный исчерпывающий ответ.
объясни вопрос сначала.
 

su1d

Старожил PHPClubа
PHP:
function miscGzHandler($buf) {
	$zipRatio = 5;	// 0 <= zipRatio <= 9
	$zipDebug = 1;	// 0 <= zipDebug <= 2

	if(empty($buf) || !isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {
		header('Content-length: '.strlen($buf));
		return $buf;
	}
	$enc_ar = explode(',', $_SERVER['HTTP_ACCEPT_ENCODING']);
	$mayZip = false; $encoding = '';
	foreach($enc_ar as $enc) {
		$enc = trim($enc);
		if('gzip' === $enc || 'x-gzip' === $enc) {
			$mayZip = true;
			$encoding = $enc;
			break;
		}
	}
	if(!$mayZip) {
		header('Content-length: '.strlen($buf));
		return $buf;
	}

	$bufZiped = gzcompress($buf, $zipRatio);
	if($zipDebug) {
		$bufLen = strlen($buf);
		$bufZipedLen= strlen($bufZiped);
		$buf .= (2 == $zipDebug) ? "\n\n<!"."--\n" : "\n<br><pre style='width:1%; border:3px ridge; background-color:white; color:gray; font:xx-small Lucida Console, Courier New; padding:3px; margin:10px;'>\n";
		$buf .= "Contenido HTML : ".$bufLen." bytes\n";
		$buf .= "Transferidos   : ".$bufZipedLen." bytes\n";
		$buf .= "Nivel GZip     : ".$zipRatio."\n";
		$buf .= "Tama±o final   : ".sprintf("%.1f%%", ($bufZipedLen/$bufLen)*100)."\n";
		$buf .= "Diferencia     : ".sprintf("%.1f", $bufLen/$bufZipedLen)." veces\n";
		$buf .= (2 == $zipDebug) ? "--".">\n" : "</pre>\n";
		$bufZiped = gzcompress($buf, $zipRatio);
	}
	$bufZiped = pack('cccccccc',0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00)
		.substr($bufZiped, 0, -4)
		.pack('V',crc32($buf))
		.pack('V',strlen($buf));
	header('Content-encoding: '.$encoding);
	header('Content-length: '.strlen($bufZiped));
	return $bufZiped;
}
PHP:
ob_start('miscGzHandler');
Дополнение:
эта ф-ция хороша тем, что добавляет Content-length к каждому выводу скрипта, чтобы сервер не рвал соединение, и броузеры могли скачать что-нибудь ещё на соединении Keep-Alive.
 

Rynor

stay hungry
извините, может я не прав, но, по-моему, есть смысл отдать компрессию самому серверу, для Apache 2 есть новый модуль:
http://httpd.apache.org/docs-2.0/mod/mod_deflate.html

в доке все там разжевано.
я его потестил, доволен, сжимает отлично
счас меня слопают за второй апач, прощайте, братцы :)

p.s. кстати, из-за этого модуля собсно я и предпочитаю второй апач первому.
p.p.s это не "против сжатия средствами PHP", это еще один нетупиковый :) вариант
 

su1d

Старожил PHPClubа
каюсь, не юзал этого модуля, поэтому есть несколько вопросов:
а) как конфигурируется этот модуль? на какие файлы? сжимает ли он ВСЕ файлы (в т.ч. и mp3 например) или только определённые (html, php, etc) ? или там по mime-type всё настраивается?
б) если расширение php, но я выдаю скриптом mp3'шку на 20М, оно будет её сжимать?
в) выдаю скриптом CSS файл. если его сжимать, то будут глюки в МСИЕ. это же опять надо конфигурить?

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

su1d

Старожил PHPClubа
почитал УРЛ, снимаю большинство вопросов.
оставляю только про контроль: некоторые скрипты надо жать, некоторые - не хочется / не надо.
Да и опять же, для юзанья этого модуля, надо сначала заставить прова включить модуль, а потом ещё конфигурить апач - не всегда это реально.
 

Sababa

Guest
to su1d:

# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary

из доки, т.е. по идее можно регами выбирать то, что надо жать или не надо.
 

Rynor

stay hungry
да!
все настраивается.

>Да и опять же, для юзанья этого модуля, надо сначала заставить прова включить модуль, а потом ещё конфигурить апач - не всегда это реально.

Согласен. У меня свой сервер, проблемы с провом никогда не испытывал, всегда, пардон, забываю о такой "мелочи"....
 

vario

Guest
>Я призываю вас дать полный исчерпывающий ответ.

а вот у меня нет своего сервера и Апач не 2

так всё же как пользоваться этим для Апача ?
или лучше ПХП?
 

vario

Guest
Автор оригинала: su1d
PHP:
function miscGzHandler($buf) {
	$zipRatio = 5;	// 0 <= zipRatio <= 9
	$zipDebug = 1;	// 0 <= zipDebug <= 2

	if(empty($buf) || !isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {
		header('Content-length: '.strlen($buf));
		return $buf;
	}
	$enc_ar = explode(',', $_SERVER['HTTP_ACCEPT_ENCODING']);
	 [/QUOTE]
>"Кроме того, запрос не должен проходить через транзитные прокси-сервера, поскольку нельзя определённо сказать, умеют ли они корректно кэшировать компрессированые ответы. Например, неумеющий правильно кэшировать сжатые ответы прокси-сервер может передать закэшированный в сжатом виде ответ клиенту, непонимающему подобное кодирование. Наличие прокси-серверов проверяется по заголовку "Via". С этим же связано ограничение на версию протокола HTTP - сжатие выполняется, только если версия запроса не ниже 1.1, так как только в этой версии прокси-сервер обязан устанавливать заголовок "Via". Для запроса версии 1.0 нельзя определённо утверждать, что запрос не проходил через прокси-сервера. "

а как это проверить?
 

su1d

Старожил PHPClubа
логично.
надо добавить проверку на $_SERVER["SERVER_PROTOCOL"] и $_SERVER['Via'];
 

Rynor

stay hungry
не запутайтесь в 2 разных модулях с одинаковым названием!

http://httpd.apache.org/docs-2.0/mod/mod_deflate.html
это родной mod_deflate Апача 2, под Апач 1 не работает

http://pflanze.mine.nu/~chris/rus/readme.html
это совсем другой mod_deflate, отечественный, для Апач 1 (Русский Апач), не знаю работает ли под 2.
 

vario

Guest
Re: Всё та же gzip компрессия :( Раз и навсегда.

Автор оригинала: col

<?php

ob_start("ob_gzhandler");

?>
<html>
<body>
<p>This should be a compressed page.
</html>
<body>
то это не заработало :(.
а что значит не заработало?
как ты это определил?
 

Прохожий

Guest
что-то вы в этой теме все в кучу свалили. И про апач и про прокси и про зип.
 

vario

Guest
да идея хорошая, такого руководства реально не хватает
всё свалили в кучу...
и ничего до конца не довели...
запороли тему....
 

col

Guest
Народ я пока вам ничего немогу сказать, потому что времени так и не хватило добраться, но когда доберусь и проонализирую всё что здесь написано + то что сам еще нашел и то что прислали, то обязательно в конце концов выложу полное руководство. Обещаю.
 

vario

Guest
Автор оригинала: col
Народ я пока вам ничего немогу сказать, потому что времени так и не хватило добраться, но когда доберусь и проонализирую всё что здесь написано + то что сам еще нашел и то что прислали, то обязательно в конце концов выложу полное руководство. Обещаю.
ну как? пришло время?
 

col

Guest
НУ вот и пришло
За 100% надобности всех строчек кода не отвечаю убирал кое что и всё равно по моему работало, но решил выложить как в источнике.
О чуть не забыл пример взят из исходников phpBB форума, так что (с) не нарушены :)).
PHP:
<?php

	header('Content-Encoding: gzip');

	ob_start();
	ob_implicit_flush(0);
?>

<html>

<head>
  <title></title>
</head>

<body>
<?
    echo "
	    Это компрессия.
        Проверить можно убрав вывод заголовка
      	'Content-Encoding: gzip'
    ";
?>
</body>

</html>

<?
	$gzip_contents = ob_get_contents();
	ob_end_clean();

	$gzip_size = strlen($gzip_contents);
	$gzip_crc = crc32($gzip_contents);

	$gzip_contents = gzcompress($gzip_contents, 9);
	$gzip_contents = substr($gzip_contents, 0, strlen($gzip_contents) - 4);

	echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
	echo $gzip_contents;
	echo pack('V', $gzip_crc);
	echo pack('V', $gzip_size);
?>
PS
Там к стате еть еще один пример который завязан именно на
ob_start("ob_gzhandler");
но как он работает а главное как проверить что он действительно работает я не понял :(
если кто знает скажите
 

sergo_stavropol

Guest
эта ф-ция хороша тем, что добавляет Content-length к каждому выводу скрипта, чтобы сервер не рвал соединение, и броузеры могли скачать что-нибудь ещё на соединении Keep-Alive.
Что это дает? скорость?
в таком случае это можно использовать во всех пхп-скриптах? Ведь Апач никогда не дает возможности воспользоваться Keep-Alive любым скриптам, и создает новые и новые соединения?
 
Сверху