Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das verstümmelte PHP-GZIP-CSS-Problem

So lösen Sie das verstümmelte PHP-GZIP-CSS-Problem

藏色散人
藏色散人Original
2021-09-26 10:21:322228Durchsuche

Lösung für verstümmelten PHP-GZIP-CSS-Code: 1. Verwenden Sie die integrierte zlib-Bibliothek. 2. Verwenden Sie CURL anstelle von „file_get_contents“.

So lösen Sie das verstümmelte PHP-GZIP-CSS-Problem

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP Version 7.1, DELL G3-Computer.

Wie löst man das verstümmelte PHP-GZIP-CSS-Problem?

Drei Lösungen für PHP file_get_contents zum Erfassen von Gzip-Webseiten mit verstümmelten Zeichen

Die Verwendung der Funktion file_get_contents() zum Erfassen von Webseiten führt zu verstümmelten Zeichen. Es gibt zwei Gründe, die zu verstümmelten Zeichen führen, und zum anderen, dass Gzip auf der Zielseite aktiviert ist. Im Folgenden erfahren Sie, wie Sie verstümmelte Zeichen vermeiden können.

Einfach übertragen den erfassten Inhalt in die Codierung umwandeln ($content=iconv("GBK", "UTF-8//IGNORE", $content);), was wir hier besprechen, ist, wie die Seite mit aktiviertem Gzip gecrawlt wird. Wie urteilen? Der erhaltene Header enthält „Content-Encoding: gzip“, was darauf hinweist, dass der Inhalt GZIP-komprimiert ist. Überprüfen Sie mit FireBug, ob gzip auf der Seite aktiviert ist. Das Folgende sind die Header-Informationen meines Blogs, die mit aktiviertem Firebug angezeigt werden.

Der Code lautet wie folgt:

Original-Header-Informationen anfordern

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

Hier sind einige Lösungen:

1. Verwenden Sie die integrierte zlib-Bibliothek

Wenn der Server die zlib-Bibliothek installiert hat, können Sie das Problem leicht lösen den verstümmelten Code mit der folgenden Codefrage.

Der Code lautet wie folgt:

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

2. Verwenden Sie CURL anstelle von file_get_contents

Der Code lautet wie folgt:

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. Verwenden Sie die gzip-Dekomprimierungsfunktion:

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;
}

Verwenden Sie:

Der Code lautet wie folgt:

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

Lassen Sie uns diese drei vorstellen. Diese Methode sollte in der Lage sein, die meisten durch gzip verursachten verstümmelten Crawling-Probleme zu lösen.

Empfohlenes Lernen: „

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo lösen Sie das verstümmelte PHP-GZIP-CSS-Problem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn