Ну, я думаю, это потому, что вы пытаетесь сжать пустую строку.
Я взял ваш скрипт так, как вы его дали, и запустил его в FF и IE.
Оба не удалось, и FF сказал, что возникла проблема (как вы описали).
Однако я заметил, что $ data - пустая строка.
Когда я установил$data = "Some test data.";
вверху файла он работал сразу (браузер отображал «Некоторые тестовые данные») и, проверяя в Firebug, я вижу правильные заголовки.
Content-Encoding gzip
Content-Length 68
Vary Accept-Encoding
Content-Type text/html
Редактировать: Кроме того, просто чтобы указать, ваш if ($supportsGzip) {
немного странный, потому что ваше условие else должно на самом деле отражаться $data
, а не $content
.
Редактировать: ХорошоИсходя из вашей пересмотренной функции, описанной выше, есть две ключевые проблемы.
Основная проблема связана с тем, что вы стираете заголовки, вызывая ob_end_clean()
.Комментарий к PHP Docs гласит, что "ob_end_clean () делает сброс заголовков".
Это означает, что все заголовки, которые вы установили перед вызовом ob_end_clean()
, будут стерты.Кроме того, ваша исправленная функция также не отправляет заголовок кодировки gzip.
Я должен сказать, что, вероятно, здесь даже не нужно использовать ob_start и связанные функции.Попробуйте следующее:
function _compress( $data ) {
$supportsGzip = strpos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) !== false;
if ( $supportsGzip ) {
$content = gzencode( trim( preg_replace( '/\s+/', ' ', $data ) ), 9);
header('Content-Encoding: gzip');
} else {
$content = $data;
}
$offset = 60 * 60;
$expire = "expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header("content-type: text/html; charset: UTF-8");
header("cache-control: must-revalidate");
header( $expire );
header( 'Content-Length: ' . strlen( $content ) );
header('Vary: Accept-Encoding');
echo $content;
}
_compress( "Some test data" );
Это работает в IE и FF, но у меня не было времени протестировать другие браузеры.
Если вам действительно нужно использовать ob_start и связанные функции, убедитесь, чтоВы устанавливаете свои заголовки после того, как вы звоните ob_end_clean()
.