PHP에는 매우 유사해 보이는 일련의 압축 및 압축 해제 기능이 있습니다.
압축 기능: gzcompress gzdeflate gzencode
압축해제 기능: gzuncompress gzinflate gzdecode
gzdecode는 PHP 5.4.0 이후에 추가되었습니다. 사용 시 호환성 문제에 주의하시기 바랍니다.
이 함수들은 모두 gz로 시작하는데, 이는 gzip 압축을 연상하게 합니다. 그러나 함수 이름만으로는 차이점을 알 수 없으므로 문서만 확인하면 됩니다.
gzcompress gzdeflate와 gzencode 함수의 차이점은 압축하는 데이터 형식이 다르다는 것입니다.
gzcompress는 ZLIB 형식을 사용합니다.
gzdeflate는 순수 DEFLATE 형식을 사용합니다.
gzencode는 GZIP 형식을 사용합니다.
하지만 한 가지는 동일합니다. 데이터를 압축할 때 모두 DEFLATE 압축 알고리즘을 사용합니다(이론적으로 ZLIB 및 GZIP 형식은 다른 압축 알고리즘을 사용할 수 있지만 현재 실제로는 DEFLATE 알고리즘만 사용됩니다). 그냥 DEFLATE 위에 헤더와 꼬리를 추가하면 됩니다.
그런데 HTTP 프로토콜의 Content-Encoding: deflate는 순수 DEFLATE 형식 대신 ZLIB 형식을 사용합니다.
PHP 5.4.0부터 gzcompress 및 gzdeflate 함수에 3개의 상수가 될 수 있는 세 번째 매개변수인 $encoding이 추가되었습니다.
ZLIB_ENCODING_RAW는 순수 DEFLATE 형식에 해당합니다.
ZLIB_ENCODING_GZIP은 GZIP 형식에 해당합니다.
ZLIB_ENCODING_DEFLATE는 ZLIB 형식에 해당합니다(순수한 DEFLATE 형식이 아님).
문서에는 언급되어 있지 않지만 이 세 가지 상수는 gzencode 함수의 세 번째 매개변수인 $encoding_mode에서도 사용할 수 있습니다.
사실 PHP 5.4.0부터 이 세 함수는 동일합니다. 단, 세 번째 매개변수의 기본값이 다릅니다. 호출 시 세 번째 매개변수가 전달되면 이 세 함수가 반환하는 데이터는 다음과 같습니다. 동일합니다. 테스트할 간단한 스크립트를 작성할 수 있습니다.
실행해 보면 $s1과 $s2가 동일한 것을 알 수 있는데 왜 그럴까요? 대답은 PHP 소스 코드에서 찾을 수 있습니다. php-5.5.4 extzipzlib.c를 열면 다음과 같은 코드를 찾을 수 있습니다.
/* 참고: 이러한 사용자 영역 함수의 이름은 매우 운이 좋지 않았습니다. */
/* {{{ 프로토 바이너리 gzdeflate(바이너리 데이터[, int level = -1[, int 인코딩 = ZLIB_ENCODING_RAW])
원시 deflate 인코딩으로 데이터를 인코딩합니다 */
PHP_ZLIB_ENCODE_FUNC(gzdeflate, PHP_ZLIB_ENCODING_RAW);
/* }}} */
/* {{{ proto 바이너리 gzencode(바이너리 데이터[, int level = -1[, int 인코딩 = ZLIB_ENCODING_GZIP])
gzip 인코딩으로 데이터 인코딩 */
PHP_ZLIB_ENCODE_FUNC(gzencode, PHP_ZLIB_ENCODING_GZIP);
/* }}} */
/* {{{ proto 바이너리 gzcompress(바이너리 데이터[, int level = -1[, int 인코딩 = ZLIB_ENCODING_DEFLATE])
zlib 인코딩으로 데이터 인코딩 */
PHP_ZLIB_ENCODE_FUNC(gzcompress, PHP_ZLIB_ENCODING_DEFLATE);
/* }}} */
gzdeflate gzencode gzcompress 3个函数city는 PHP_ZLIB_ENCODE_FUNC宏定义的(是不是有些泛型的意味?),所以它们当然是同的입니다.