>백엔드 개발 >PHP 문제 >PHP gzip CSS 왜곡 문제를 해결하는 방법

PHP gzip CSS 왜곡 문제를 해결하는 방법

藏色散人
藏色散人원래의
2021-09-26 10:21:322277검색

php gzip css 잘못된 코드에 대한 해결 방법: 1. 내장된 zlib 라이브러리를 사용합니다. 2. "file_get_contents" 대신 CURL을 사용합니다. 3. gzip 압축 해제 기능을 사용하여 잘못된 코드 문제를 해결합니다.

PHP gzip CSS 왜곡 문제를 해결하는 방법

이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터.

PHP gzip CSS 깨짐 문제를 해결하는 방법?

깨진 문자가 있는 Gzip 웹 페이지를 가져오는 PHP file_get_contents의 세 가지 솔루션

file_get_contents() 함수를 사용하여 웹 페이지를 가져오면 코드가 깨집니다. 문자 깨짐 현상이 발생하는 이유는 두 가지입니다. 하나는 인코딩 문제이고, 다른 하나는 대상 페이지에서 Gzip이 활성화되어 있다는 것입니다. 다음은 Gzip 기능을 켜서 문자 깨짐을 방지하는 방법입니다. 캡처한 콘텐츠를 인코딩($content=iconv("GBK", "UTF-8//IGNORE", $content);)으로 변환합니다. 여기서 논의할 내용은 Gzip을 켠 상태에서 페이지를 크롤링하는 방법입니다. 어떻게 판단하나요? 획득한 헤더에는 콘텐츠가 GZIP 압축되었음을 나타내는 Content-Encoding: gzip이 포함되어 있습니다. FireBug를 사용하여 페이지에서 gzip이 활성화되어 있는지 확인하세요. 다음은 Gzip을 켜서 본 블로그의 헤더 정보입니다.

코드는 다음과 같습니다.

헤더 정보 원본 헤더 정보 요청

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Connection keep-alive
Cookie __utma=225240837.787252530.1317310581.1335406161.1335411401.1537; __utmz=225240837.1326850415.887.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=%E4%BB%BB%E4%BD%95%E9%A1%B9%E7%9B%AE%E9%83%BD%E4%B8%8D%E4%BC%9A%E9%82%A3%E4%B9%88%E7%AE%80%E5%8D%95%20site%3Awww.nowamagic.net; PHPSESSID=888mj4425p8s0m7s0frre3ovc7; __utmc=225240837; __utmb=225240837.1.10.1335411401
Host www.nowamagic.net
User-Agent Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0

해결책은 다음과 같습니다.

1 내장 zlib 라이브러리를 사용하세요

서버에 zlib 라이브러리가 설치되어 있으면 쉽게 해결할 수 있습니다. 다음 코드 질문이 포함된 잘못된 코드입니다.

코드는 다음과 같습니다.

$data = file_get_contents("compress.zlib://".$url);

2. file_get_contents 대신 CURL을 사용합니다.

코드는 다음과 같습니다.

function curl_get($url, $gzip=false){
 $curl = curl_init($url);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
 if($gzip) curl_setopt($curl, CURLOPT_ENCODING, "gzip"); // 关键在这里
 $content = curl_exec($curl);
 curl_close($curl);
 return $content;
}

3.gzip 압축 해제 기능을 사용합니다.

코드는 다음과 같습니다.

function gzdecode($data) {
  $len = strlen($data);
  if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
    return null;  // Not GZIP format (See RFC 1952)
  }
  $method = ord(substr($data,2,1));  // Compression method
  $flags  = ord(substr($data,3,1));  // Flags
  if ($flags & 31 != $flags) {
    // Reserved bits are set -- NOT ALLOWED by RFC 1952
    return null;
  }
  // NOTE: $mtime may be negative (PHP integer limitations)
  $mtime = unpack("V", substr($data,4,4));
  $mtime = $mtime[1];
  $xfl   = substr($data,8,1);
  $os    = substr($data,8,1);
  $headerlen = 10;
  $extralen  = 0;
  $extra     = "";
  if ($flags & 4) {
    // 2-byte length prefixed EXTRA data in header
    if ($len - $headerlen - 2 < 8) {
      return false;    // Invalid format
    }
    $extralen = unpack("v",substr($data,8,2));
    $extralen = $extralen[1];
    if ($len - $headerlen - 2 - $extralen < 8) {
      return false;    // Invalid format
    }
    $extra = substr($data,10,$extralen);
    $headerlen += 2 + $extralen;
  }
  $filenamelen = 0;
  $filename = "";
  if ($flags & 8) {
    // C-style string file NAME data in header
    if ($len - $headerlen - 1 < 8) {
      return false;    // Invalid format
    }
    $filenamelen = strpos(substr($data,8+$extralen),chr(0));
    if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
      return false;    // Invalid format
    }
    $filename = substr($data,$headerlen,$filenamelen);
    $headerlen += $filenamelen + 1;
  }
  $commentlen = 0;
  $comment = "";
  if ($flags & 16) {
    // C-style string COMMENT data in header
    if ($len - $headerlen - 1 < 8) {
      return false;    // Invalid format
    }
    $commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
    if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
      return false;    // Invalid header format
    }
    $comment = substr($data,$headerlen,$commentlen);
    $headerlen += $commentlen + 1;
  }
  $headercrc = "";
  if ($flags & 1) {
    // 2-bytes (lowest order) of CRC32 on header present
    if ($len - $headerlen - 2 < 8) {
      return false;    // Invalid format
    }
    $calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
    $headercrc = unpack("v", substr($data,$headerlen,2));
    $headercrc = $headercrc[1];
    if ($headercrc != $calccrc) {
      return false;    // Bad header CRC
    }
    $headerlen += 2;
  }
  // GZIP FOOTER - These be negative due to PHP&#39;s limitations
  $datacrc = unpack("V",substr($data,-8,4));
  $datacrc = $datacrc[1];
  $isize = unpack("V",substr($data,-4));
  $isize = $isize[1];
  // Perform the decompression:
  $bodylen = $len-$headerlen-8;
  if ($bodylen < 1) {
    // This should never happen - IMPLEMENTATION BUG!
    return null;
  }
  $body = substr($data,$headerlen,$bodylen);
  $data = "";
  if ($bodylen > 0) {
    switch ($method) {
      case 8:
        // Currently the only supported compression method:
        $data = gzinflate($body);
        break;
      default:
        // Unknown compression method
        return false;
    }
  } else {
    // I&#39;m not sure if zero-byte body content is allowed.
    // Allow it for now...  Do nothing...
  }
  // Verifiy decompressed size and CRC32:
  // NOTE: This may fail with large data sizes depending on how
  //       PHP&#39;s integer limitations affect strlen() since $isize
  //       may be negative for large sizes.
  if ($isize != strlen($data) || crc32($data) != $datacrc) {
    // Bad format!  Length or CRC doesn&#39;t match!
    return false;
  }
  return $data;
}

사용:

코드는 다음과 같습니다.

$html=file_get_contents(&#39;https://www.jb51.net/&#39;);
$html=gzdecode($html);

이 세 가지를 소개하겠습니다. 이 방법은 gzip으로 인해 발생하는 잘못된 크롤링 문제를 대부분 해결할 수 있을 것입니다.

추천 학습: "

PHP 비디오 튜토리얼

"

위 내용은 PHP gzip CSS 왜곡 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.