호스팅 사이트에서 gzip 압축 사용하기
게시일: 2004/11/25 | 글쓴이: doa | 13467 번 | 프린트 | 메일


사실 이 팁은 필자의 홈페이지의 트래픽이 부족하지 않았다면 절대 나올 수 없는 팁이었다. 작년 9월경 자체 서버로 운영하던 홈페이지를 웹 호스팅으로 변경했다. 변경하면서 가장 큰 문제는 트래픽이었다. 트래픽 여유가 있는 사양은 금전적인 문제가 발생하고, 금전적으로 부담이 없는 시스템의 경우 트래픽 초과가 너무 빈번하게 발생했었다.

그러다가 HTML 파일을 압축해서 전송하면 트래픽이 상당히 줄을거라는 생각이 들었다. 이런 생각을 하게된 근본적인 동기는 필자의 CGI 강좌에서 알 수 있지만 HTTP/1.1의 경우 기본 인코딩이 gzip이었기 때문이다.

이 팁은 근본적으로 HTTP/1.1에서만 동작한다주1. 그 이유는 앞서 설명했듯 HTTP/1.0에서는 gzip 인코딩을 지원하지 않기때문이다.

PHP에의해 실시간으로 생성된 파일을 gzip으로 압축하는 방법은 여러가지가 있다. 자체 서버를 기동하는 경우에는 mod_gzip 이라는 모듈을 설치하면 된다. 그러나 자체서버를 이용하는 사람이라면 당연한 얘기지만 트래픽을 고민한 필요는 없다.

트래픽 문제로 압축을 필요로하는 사람의 경우 호스팅 서버에 mod_gzip을 설치할 수 있는 방법이 없다. 그러나 크게 걱정할 필요는 없다. PHP 자체내에서 gzip을 지원하므로 PHP 자체에서 지원하는 gzip 함수를 이용해서 압축 전송하면된다. 절차는 다음과 같다주2.

  1. 메인 라이브러리 파일(예: main.php)에 다음과 같은 두개의 함수를 등록한다.
    /* 브로우저가 gzip 인코딩을 지원하는지 판정하는 함수 */
    function CheckCanGzip(){
        global $_SERVER;
        if (headers_sent() || connection_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=최대 */ function GzDocOut($level=9,$debug=0){ global $phpEx; $ENCODING = CheckCanGzip();

    // gzip 테스팅을 위한 행. 다음 행의 주석을 제거하면 무조건 gzip으로 압축해서 전송하며, // 다음행을 삭제하면 브로우저가 gzip 인코딩을 지원하는 경우에만 gzip으로 압축해서 전송함. // $ENCODING = 'gzip';

    if ($ENCODING){ print "\n<!-- Use compress $ENCODING -->\n"; $Contents = ob_get_contents(); ob_end_clean(); if ($debug){ $s = "<p>Not compress length: ".strlen($Contents); $s .= "<br>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); } }



  2. 동적으로 파일을 생성하는 PHP 파일(예: index.php)을 다음과 같은 형식으로 작성한다.
    <?
    include("main.php");
    ob_start(); // 반드시 문서를 출력하기전에 기동해야함
    ob_implicit_flush(0); 
    ?>
    ...
    ...
    ...
    <?
    GzDocOut(); // 실시간 압축 함수 호출
    ob_end_flush(); 
    ?>


실제 gzip으로 압축되어 전송되는지 확인하려면 // $ENCODING = 'gzip'; 행의 주석을 제거하고 다운로드 가속기(예: FlashGet, Net Transport)로 다운을 받아보면된다.

다운로드: 소스 적용이 조금 어려운 사용자는 다음 링크에서 예제 파일을 다운받아 테스트해보기 바란다. 압축 파일에는 다음과 같은 파일이 포함되어 있다.

gzip.php	// Gzip 압축용 라이브러리
test.php	// Gzip 압축을 테스트하는 예제 파일
다운로드: php_gzip.zip


주1: QAOS.com 접속시 다운로드 창이 뜨는 경우를 참조하면 인터넷 탐색기에서는 HTTP/1.1의 지원 여부를 사용자가 설정할 수 있다는 것을 알 수 있다.

주2: 이 팁에서 소개하는 두 함수는 필자가 개발한 것이 아니라 catoc가 개발한 함수이다.


새로운 P2P 프로그램, BitTorrent BitTorrent는 필자가 소개한 eDonkey나 eMule과 비슷... (29900) 2004-11-25
보내기 메뉴 위치 바꾸기 필자의 이전 팁, 보내기 메뉴에서 A: 드라이브 제거하기를 쓰... (4112)2004-11-25

QAOS.com에 게시된지 1년 이상된 자료와 관리자가 공개한 자료는 누구나 제한없이 읽을 수 있습니다.
그러나 QAOS.com의 자료를 퍼가는 것은 금지하고 있습니다.

이 정보가 유용하다고 생각되시면 QAOS.com과 많은 다른 사람들을 위해 퍼가기 보다는 링크로 알려주시기 바랍니다.

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.