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

Тема в разделе "PHP", создана пользователем dandandan, 30 июл 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Текстовые данные 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;
    }
    
    В результате яндекс ругается на Передано неверное количество данных. В следствии уменьшилось количество страниц в поиске.
    Где что подрихтовать?
     
  2. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    А в чём смысл сего шамансого ритуала? Если уж и собирать PHP-код налету, то надо использовать var_export для экранирования строки в стиле PHP.

    Надо проверить, возможно где то выше/ниже имеется случайный вывод браузеру.
    И может вместо мудрежа с gzcompress и ручным подсчётом crc32, стоит использовать gzencode?
     
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Что такое var_export - не знаю.
    используется чтобы
    в переменной $textik='э'.$s.'э' (получается из $tixtik=file_get_contents()); инициализировать все вставленные переменные.

    Ошибок выше быть не может, т.к. отправляется:
    + выше ставятся куки. на сайте вылазила бы ошибка.

    по поводу последнего совета - попробую. Правда не понятен последний участок кода:
    Код:
       
    .................     
         $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;
    Что в нем убрать?
    // наверное этот кусок надо убрать
     
  4. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    Вроде бы яндекс как раз на это и ругается, что Content-length не совпадает с реальной длиной полученных данных. А посторонний вывод может быть и ниже.
     
  5. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    У меня формируется $textik - это полностью весь текстовый документ. Ниже ничего не передается уже. До того момента, как подключил gzip делал просто
    Код:
    echo $texik;
    Есть еще подключаемые ява скрипты, но все это прописано в $textik .

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

    betatest

    Регистр.:
    3 дек 2007
    Сообщения:
    517
    Симпатии:
    127
    можно грузить страницу с сервера скриптом с параметрами
    приема сжатых страниц

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

    ессно контент должен быть одинковым
     
    irk нравится это.
  7. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    а если выкинуть строчку header('Content-length: ' . strlen($bufZiped));
    От этого будет ли какой-нибудь страшный криминал?

    Написал в Яндекс - порекомендовали посмотреть настройки сервера. Написал в хостинг - компанию mchost. Ответили:
    Отключил. Все индексируется.
     
Статус темы:
Закрыта.