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“.
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'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; }
Verwenden Sie:
Der Code lautet wie folgt:
$html=file_get_contents('https://www.jb51.net/'); $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-TutorialDas 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!