Gzip + PHP + Apache
Вообще, к этому исходнику я не имею никакого отношения, но он мне так стильно понравился, что я его не мог не выложить. У меня все заработало с первого раза.
Основное назначение — передача HTML страниц между браузером и сервером в запакованном виде. У меня в среднем сжималось в 4 раза.
Одно «НО»: Не ставьте уровень сжатия больше 3 — размер не уменьшится, а нагрузка на сервер — еще как.
/* ** Title.........: PHP4 HTTP Compression Speeds up the Web ** Version.......: 1.20 ** Author........: catoc ** Filename......: gzdoc.php ** Last changed..: 18/10/2000 ** Requirments...: PHP4 >= 4.0.1 ** PHP was configured with --with-zlib[=DIR] ** Notes.........: Dynamic Content Acceleration compresses ** the data transmission data on the fly ** code by sun jin hu (catoc) ** Most newer browsers since 1998/1999 have ** been equipped to support the HTTP 1.1 ** standard known as "content-encoding." ** Essentially the browser indicates to the ** server that it can accept "content encoding" ** and if the server is capable it will then ** compress the data and transmit it. The ** browser decompresses it and then renders ** the page. ** ** Modified by John Lim (jlim@natsoft.com.my) ** based on ideas by Sandy McArthur, Jr ** Usage........: ** No space before the beginning of the first '< ?' tag. ** ------------Start of file---------- ** | ** | include('gzdoc.php'); ** |?> ** | ** |... the page ... ** | ** |< ? ** | gzdocout(); ** |?> ** -------------End of file----------- */ ob_start(); ob_implicit_flush(0); function CheckCanGzip() { global $HTTP_ACCEPT_ENCODING; if (headers_sent() || connection_aborted()) { return 0; } if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip"; if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip"; return 0; } /* $level = compression level 0-9, 0=none, 9=max */ function GzDocOut($level=3,$debug=0){ $ENCODING = CheckCanGzip(); if ($ENCODING) { print "\n\n"; $Contents = ob_get_contents(); ob_end_clean(); if ($debug) { $s = "Not compress length: ".strlen($Contents)."; "; $s .= "Compressed length: ".strlen(gzcompress($Contents,$level)).""; $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, strlen($Contents) - 4); print $Contents; print pack('V',$Crc); print pack('V',$Size); exit; } else { ob_end_flush(); exit; } }
Комментарии