Maison >développement back-end >Problème PHP >Comment résoudre le problème php gzip css tronqué

Comment résoudre le problème php gzip css tronqué

藏色散人
藏色散人original
2021-09-26 10:21:322277parcourir

Solution au code tronqué CSS php gzip : 1. Utilisez la bibliothèque zlib intégrée ; 2. Utilisez CURL au lieu de "file_get_contents" ; 3. Utilisez la fonction de décompression gzip pour résoudre le problème du code tronqué.

Comment résoudre le problème php gzip css tronqué

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur DELL G3.

Comment résoudre le problème php gzip css tronqué ?

Trois solutions pour php file_get_contents pour récupérer des pages Web Gzip avec des caractères tronqués

L'utilisation de la fonction file_get_contents() pour récupérer des pages Web entraînera des caractères tronqués. Il y a deux raisons qui entraîneront des caractères tronqués. L'une est le problème d'encodage et l'autre est que Gzip est activé sur la page cible. Voici comment éviter les caractères tronqués en activant la fonction Gzip

Transférez simplement le. contenu capturé à l'encodage ($content=iconv("GBK", "UTF-8//IGNORE", $content);), ce dont nous discutons ici est de savoir comment explorer la page avec Gzip activé. Comment juger ? L'en-tête obtenu contient Content-Encoding: gzip indiquant que le contenu est compressé GZIP. Utilisez FireBug pour vérifier si gzip est activé sur la page. Voici les informations d'en-tête de mon blog consultées avec Firebug qui sont activées.

Le code est le suivant :

Demander des informations sur l'en-tête d'origine

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

Voici quelques solutions :

1. Utilisez la bibliothèque zlib intégrée

Si le serveur a installé la bibliothèque zlib, vous pouvez facilement résoudre le code tronqué avec la question de code suivante.

Le code est le suivant :

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

2. Utilisez CURL au lieu de file_get_contents

Le code est le suivant :

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. Utilisez la fonction de décompression gzip

Le code est le suivant :

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

Utilisez :

Le code est le suivant :

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

Présentons ces trois méthodes. Cette méthode devrait être capable de résoudre la plupart des problèmes d'exploration tronqués causés par gzip.

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn