Помогите найти ошибку по использованию gzip

Статус
В этой теме нельзя размещать новые ответы.

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Текстовые данные html страницы вывожу так
Код:
	eval('?><? $textik= \''.$textik. '\';');
	echo miscGzHandler(htmlCompress($textik));
Используемые функции сжатия
Код:
function htmlCompress($html){
  	//return $html;
preg_match_all('!(<(?:code|pre|textarea|script)[^>]+>.*?</(?:code|pre|textarea|script)>)!si',$html,$pre);
$html = preg_replace('!<(?:code|pre|textarea|script)[^>]+>.*?</(?:code|pre|textarea|script)>!si', '#pre#', $html);		
   // preg_match_all('!(<(?:code|pre|script).*>[^<]+</(?:code|pre|script)>)!',$html,$pre);
   //$html = preg_replace('!<(?:code|pre).*>[^<]+</(?:code|pre)>!', '#pre#', $html);
$html = preg_replace('#<!–[^\[].+–>#', '', $html);
$html = preg_replace('/[\r\n\t]+/', ' ', $html);
$html = preg_replace('/>[\s]+</', '><', $html);
$html = preg_replace('/[\s]+/', ' ', $html);
if (!empty($pre[0])) {
	foreach ($pre[0] as $tag) {
    	$html = preg_replace('!#pre#!', $tag, $html,1);
      	}
   	}
  	return $html;
	} 
//************************
function miscGzHandler($buf) {
    $zipRatio = 1;    // 0 <= zipRatio <= 9
    $zipDebug = 0;    // 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>\n";
        $buf .= "Размер оригинала HTML : " . $bufLen . " bytes\n";
        $buf .= "Компрессир. размер: " . $bufZipedLen . " bytes\n";
        $buf .= "Степень компрессии: " . $zipRatio . "\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;
}
В результате яндекс ругается на Передано неверное количество данных. В следствии уменьшилось количество страниц в поиске.
Где что подрихтовать?
 
Код:
	eval('?><? $textik= \''.$textik. '\';');

А в чём смысл сего шамансого ритуала? Если уж и собирать PHP-код налету, то надо использовать var_export для экранирования строки в стиле PHP.

Надо проверить, возможно где то выше/ниже имеется случайный вывод браузеру.
И может вместо мудрежа с gzcompress и ручным подсчётом crc32, стоит использовать gzencode?
 
Что такое var_export - не знаю.
eval('?><? $textik= \''.$textik. '\';');
используется чтобы
в переменной $textik='э'.$s.'э' (получается из $tixtik=file_get_contents()); инициализировать все вставленные переменные.

Ошибок выше быть не может, т.к. отправляется:
header('Content-length: ' . strlen($bufZiped));
+ выше ставятся куки. на сайте вылазила бы ошибка.

по поводу последнего совета - попробую. Правда не понятен последний участок кода:
Код:
.................     
     $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;
Что в нем убрать?
$bufZiped = pack('cccccccc', 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00)
. substr($bufZiped, 0, -4)
. pack('V', crc32($buf))
. pack('V', strlen($buf));
// наверное этот кусок надо убрать
 
Вроде бы яндекс как раз на это и ругается, что Content-length не совпадает с реальной длиной полученных данных. А посторонний вывод может быть и ниже.
 
У меня формируется $textik - это полностью весь текстовый документ. Ниже ничего не передается уже. До того момента, как подключил gzip делал просто
Код:
echo $texik;
Есть еще подключаемые ява скрипты, но все это прописано в $textik .

Может можно как-нибудь узнать этот Content-length чтобы поэкспериментировать?
 
можно грузить страницу с сервера скриптом с параметрами
приема сжатых страниц

или принять какую нидь страницу браузером с перехватом - хттп_хеадерс и посмотреть сжатую и не сжатую, потом дальше смотреть, я так делал

ессно контент должен быть одинковым
 
  • Нравится
Реакции: irk
а если выкинуть строчку header('Content-length: ' . strlen($bufZiped));
От этого будет ли какой-нибудь страшный криминал?

Написал в Яндекс - порекомендовали посмотреть настройки сервера. Написал в хостинг - компанию mchost. Ответили:
На наших серверах установлена система реверс проксирования и вероятнее всего из-за этого различается размер в заголовках. Мы рекомендуем вам отключить функцию сжатия чтобы избежать проблем с индексацией.
Отключил. Все индексируется.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху