Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Gzip+xHTML - возможно?
 
 автор: amigo62   (09.11.2007 в 12:08)   письмо автору
 
 

Всем большой привет=)
В первый раз столкнулся со сжатием страниц
и вчастности с функциями буферизации, и нужна ваша помощь.
Для сжатия использую вот такой код:
<?php
#GZIP test
ob_start();
ob_implicit_flush(0);
function 
CheckCanGzip()
{
if(
headers_sent()||connect_aborted())
{
return 
0;
}
if(
strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'x-gzip')!==false)
{
return 
'x-gzip';
}
if(
strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip')!==false)
{
return 
'gzip';
return 
0;
}
}
#$level- уровень компрессии.
#0-9, 0- выкл., 9- макс.
#рекомендуется не более 3-х
function GzDocOut($level,$debug)
{
$ENCODING=CheckCanGzip();
if(
$ENCODING)
{
print 
"<!--use $ENCODING-->";
$Contents=ob_get_contents();
ob_end_clean();
if(
$debug>0)
{
$s='Not compress length: '.strlen($Contents).';
'
;
$s.='Compressed length: '.strlen(gzcompress($Contents,$level)).'<br />';
$Contents.=$s;
}
header("Content-Encoding: $ENCODING");
print 
"\x1f\x8b\x08\x00\x00\x00\x00\x00";
$size=strlen($Contents);
$crc=crc32($Contents);
$Contents=gzcompress($Contents,$level);
$Contents=substr($Contents,0,$size-4);
print 
$Contents;
print 
pack('v',$crc);
print 
pack('v',$size);
exit;
}else{
ob_end_flush();
exit;
}
}
include(
'index.php');
$level=3;
$debug=1;
GzDocOut($level,$debug);
?>

, фрагмент include('index.php'); это, собственно, то, что требуется сжать.
index.php в самом начале содержит header("Content-type: application/xhtml+xml; charset=utf-8");
, но страницы почему-то открываются как обычные HTML. Можно ли всё же как то сжать и при этом отправить заголовки xHTML? Ведь сжатие, насколько я знаю, применяют даже для WML- контента

   
 
 автор: Gemorroj   (09.11.2007 в 15:53)   письмо автору
 
   для: amigo62   (09.11.2007 в 12:08)
 

> но страницы почему-то открываются как обычные HTML
А как они еще должны открываться? Вероятно они уже сжаты.

   
 
 автор: amigo62   (09.11.2007 в 16:03)   письмо автору
 
   для: Gemorroj   (09.11.2007 в 15:53)
 

Гм, читайте ещё внимательней... Точнее описать проблему не могу

   
 
 автор: amigo62   (09.11.2007 в 16:05)   письмо автору
 
   для: Gemorroj   (09.11.2007 в 15:53)
 

Хотя могу! Как сделать так, чтобы при декомпрессии браузер учитывал заголовок Content-type?

   
 
 автор: mihdan   (09.11.2007 в 17:35)   письмо автору
 
   для: amigo62   (09.11.2007 в 16:05)
 

А что не учитывает?

   
 
 автор: amigo62   (09.11.2007 в 19:52)   письмо автору
 
   для: mihdan   (09.11.2007 в 17:35)
 

Люди, неужели не знает никто???

   
 
 автор: Gemorroj   (09.11.2007 в 21:31)   письмо автору
 
   для: amigo62   (09.11.2007 в 19:52)
 

Т.е. Content-type приходит text/html не смотря на то что Вы указали application/xhtml+xml?
Думаю проблема не в Gzip
Я всегда юзаю и Gzip и application/xhtml+xml и впервые слышу о такой проблеме.

   
 
 автор: amigo62   (10.11.2007 в 10:13)   письмо автору
 
   для: Gemorroj   (09.11.2007 в 21:31)
 

Совершенно верно! А у Вас имеется рабочий пример кода на эту тему? У меня такое впечатление, что мой ничего не сжимает. Написал бы сам, но не до конца разобрался ещё с буферизацией, а надо очень срочно... Выручите?=)

   
 
 автор: Gemorroj   (10.11.2007 в 14:08)   письмо автору
 
   для: amigo62   (10.11.2007 в 10:13)
 


<?php
if(@$_SERVER['HTTP_ACCEPT_ENCODING'])
{
$compress strtolower(@$_SERVER['HTTP_ACCEPT_ENCODING']);}
else
{
$compress strtolower(@$_SERVER['HTTP_TE']);}

if(
substr_count($compress,'deflate'))
{
function 
compress_output_deflate($output)
{return 
gzdeflate($output,4);}

header('Content-Encoding: deflate');
ob_start('compress_output_deflate');
ob_implicit_flush(0);
}
elseif(
substr_count($compress,'gzip'))
{
function 
compress_output_gzip($output)
{return 
gzencode($output,4);}

header('Content-Encoding: gzip');
ob_start('compress_output_gzip');
ob_implicit_flush(0);
}
elseif(
substr_count($compress,'x-gzip'))
{
function 
compress_output_x_gzip($output)
{
$x "\x1f\x8b\x08\x00\x00\x00\x00\x00";
$size strlen($output);
$crc crc32($output);
$output gzcompress($output,4);
$output substr($output0strlen($output) - 4);
$x.= $output;
$x.= pack('V',$crc);
$x.= pack('V',$size);
return 
$x;
}

header('Content-Encoding: x-gzip');
ob_start('compress_output_x_gzip');
ob_implicit_flush(0);
}
?>


Это файл gzip.php всавляю его повсюду.
Есть этот скрипт с ридми на сайте, но сайт к сожалению временно не работает =(
Здесь цифра 4 (gzdeflate($output,4) и др.) это метод компрессии, от него зависит степень компессии. Возможные значения от 0 (не сжимает) до 9 (сжимает максимально). Но выше 4 ставить не стоит, выигрыш в степени компрессии минимален, а вот ресурсов сервера расходуется куда больше.
Так же лучше всего показала себя иерархия вида - deflate, gzip, x-gzip. Хотя пока не встречал браузера который бы поддерживал x-gzip и не поддерживал deflate или gzip.

   
 
 автор: amigo62   (10.11.2007 в 15:54)   письмо автору
 
   для: Gemorroj   (10.11.2007 в 14:08)
 

Спасибо большое! Теперь всё нормально! А как теперь вставить в страницу запись типа: "Gz: on 43%" (т.е. обозначить в тексте метод и степень сжатия)?

   
 
 автор: Gemorroj   (10.11.2007 в 16:59)   письмо автору
 
   для: amigo62   (10.11.2007 в 15:54)
 

Вот

   
 
 автор: amigo62   (10.11.2007 в 19:07)   письмо автору
 
   для: Gemorroj   (10.11.2007 в 16:59)
 

Спасибо, век не забуду=) правда, в самом начале файла вылезает
IN: 0 байт<br />
OUT: 2 байт<br />
Сжатие: 100 %<br />
Метод: deflate<br />
Поддерживаемые методы компрессии: deflate, gzip, x-gzip, identity, *;q=0
но думаю, дальше сам разберусь)

   
 
 автор: amigo62   (10.11.2007 в 19:16)   письмо автору
 
   для: Gemorroj   (10.11.2007 в 16:59)
 

Всё, врубился как подогнать под скрипт=) Еще раз мерси=)

   
 
 автор: amigo62   (11.11.2007 в 19:51)   письмо автору
 
   для: amigo62   (10.11.2007 в 19:16)
 

Насколько я понимаю, deflate- самый примитивный метод, а x-gzip- самый продвинутый? Перевернул иерархию, см. аттач

   
 
 автор: Gemorroj   (11.11.2007 в 20:40)   письмо автору
 
   для: amigo62   (11.11.2007 в 19:51)
 

Откуда такое мнение?

   
 
 автор: amigo62   (16.11.2007 в 20:32)   письмо автору
 
   для: Gemorroj   (11.11.2007 в 20:40)
 

x-gzip жмет сильнее...

   
 
 автор: Gemorroj   (16.11.2007 в 20:44)   письмо автору
 
   для: amigo62   (16.11.2007 в 20:32)
 

у меня все наоборот получилось =) deflate сильнее всех жмет, gzip средне, а x-gzip еще хуже
в методах компрессии не силен, прокомментировать грамотно не смогу.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования