php gzip css 잘못된 코드에 대한 해결 방법: 1. 내장된 zlib 라이브러리를 사용합니다. 2. "file_get_contents" 대신 CURL을 사용합니다. 3. gzip 압축 해제 기능을 사용하여 잘못된 코드 문제를 해결합니다.
이 기사의 운영 환경: 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'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'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'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't match! return false; } return $data; }
사용:
코드는 다음과 같습니다.
$html=file_get_contents('https://www.jb51.net/'); $html=gzdecode($html);
이 세 가지를 소개하겠습니다. 이 방법은 gzip으로 인해 발생하는 잘못된 크롤링 문제를 대부분 해결할 수 있을 것입니다.
추천 학습: "
PHP 비디오 튜토리얼"
위 내용은 PHP gzip CSS 왜곡 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!