> 백엔드 개발 > PHP 튜토리얼 > PHP_php 예제의 gzcompress, gzdeflate 및 gzencode 함수에 대한 자세한 설명

PHP_php 예제의 gzcompress, gzdeflate 및 gzencode 함수에 대한 자세한 설명

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-05-16 20:38:58
원래의
1429명이 탐색했습니다.

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부터 이 세 함수는 동일합니다. 단, 세 번째 매개변수의 기본값이 다릅니다. 호출 시 세 번째 매개변수가 전달되면 이 세 함수가 반환하는 데이터는 다음과 같습니다. 동일합니다. 테스트할 간단한 스크립트를 작성할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

$url = 'http://jb51.net';
$s1 = gzdeflate($url, 1);
$s2 = gzencode($url, 1, ZLIB_ENCODING_RAW);
if (strcmp($s1, $s2) == 0) echo '동일';
?>

실행해 보면 $s1과 $s2가 동일한 것을 알 수 있는데 왜 그럴까요? 대답은 PHP 소스 코드에서 찾을 수 있습니다. php-5.5.4 extzipzlib.c를 열면 다음과 같은 코드를 찾을 수 있습니다.


코드 복사 코드는 다음과 같습니다.

#define PHP_ZLIB_ENCODE_FUNC(이름, 기본_인코딩)
정적 PHP_FUNCTION(이름)
{
    char *in_buf, *out_buf;
    int in_len;
    size_t out_len;
    긴 수준 = -1;
    긴 인코딩 = default_encoding;
    if (default_encoding) {
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &in_buf, &in_len, &level, &encoding)) {
            반품;
        }
    } 다른 {
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|l", &in_buf, &in_len, &encoding, &level)) {
            반품;
        }
    }
    if (레벨 9) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "압축 수준(%ld)은 -1..9 이내여야 합니다.", level);
        RETURN_FALSE;
    }
    스위치(인코딩) {
        사례 PHP_ZLIB_ENCODING_RAW:
        사례 PHP_ZLIB_ENCODING_GZIP:
        사례 PHP_ZLIB_ENCODING_DEFLATE:
            부서지다;
        기본값:
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "인코딩 모드는 ZLIB_ENCODING_RAW, ZLIB_ENCODING_GZIP 또는 ZLIB_ENCODING_DEFLATE 중 하나여야 합니다.");
            RETURN_FALSE;
    }
    if (SUCCESS != php_zlib_encode(in_buf, in_len, &out_buf, &out_len, 인코딩, 레벨 TSRMLS_CC)) {
        RETURN_FALSE;
    }
    RETURN_STRINGL(out_buf, out_len, 0);
}


/* 참고: 이러한 사용자 영역 함수의 이름은 매우 운이 좋지 않았습니다. */
/* {{{ 프로토 바이너리 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宏定义的(是不是有些泛型的意味?),所以它们当然是同的입니다.

관련 라벨:
php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿