2008-11-22 7 views
46

Je récupère une page web gzippée via curl, mais quand je publie le contenu récupéré dans le navigateur, je viens d'obtenir les données brutes gzippées. Comment puis-je décoder les données en PHP?Decode gzipped page web récupérée via cURL en PHP

Une méthode que j'ai trouvé pour écrire le contenu dans un fichier tmp puis ...

$f = gzopen($filename,"r"); 
$content = gzread($filename,250000); 
gzclose($f); 

.... mais l'homme, il faut que ce soit une meilleure façon.

Modifier: Ce n'est pas un fichier, mais une page gzippée en HTML retournée par un serveur web.

+0

Est-ce le fichier lui-même au format gzip, ou est le serveur gzipping pour le transfert? – Artelius

+2

Au lieu de décoder les données gzip, pourriez-vous simplement envoyer les en-têtes appropriés afin que le navigateur le reconnaisse correctement? Ou, si vous ne voulez pas qu'il soit gzippé en premier lieu, dites à cURL de ne pas demander de données gzippées en réglant CURLOPT_ENCODING sur "identity". –

Répondre

101

Je CURL et:

curl_setopt($ch,CURLOPT_ENCODING , "gzip"); 
+11

Juste pour noter que cette option définit l'en-tête 'Accept-Encoding: gzip' sur la requête * et * décompresse la réponse si elle est compressée (ce n'est peut-être pas le cas), c'est donc tout ce que vous devez faire. – Synchro

+0

Solution parfaite pour CURL. –

+4

Si vous le configurez sur "gzip", il enverra toujours "Accept-Encoding: gzip", même si votre version de PHP ne supporte pas le décodage de gzip (vous obtiendrez alors les données compressées). Si vous le réglez sur '' '' (chaîne vide), curl annoncera automatiquement et décodera tous les encodages qu'il supporte. – AndreKR

2

fonction polyvalente GUNZIP:

 
    function gunzip($zipped) { 
     $offset = 0; 
     if (substr($zipped,0,2) == "\x1f\x8b") 
     $offset = 2; 
     if (substr($zipped,$offset,1) == "\x08") { 
     # file_put_contents("tmp.gz", substr($zipped, $offset - 2)); 
     return gzinflate(substr($zipped, $offset + 8)); 
     } 
     return "Unknown Format"; 
    } 

Exemple de fonction d'intégration avec CURL:

 
     $headers_enabled = 1; 
     curl_setopt($c, CURLOPT_HEADER, $headers_enabled) 
     $ret = curl_exec($c); 

     if ($headers_enabled) { 
     # file_put_contents("preungzip.html", $ret); 

     $sections = explode("\x0d\x0a\x0d\x0a", $ret, 2); 
     while (!strncmp($sections[1], 'HTTP/', 5)) { 
      $sections = explode("\x0d\x0a\x0d\x0a", $sections[1], 2); 
     } 
     $headers = $sections[0]; 
     $data = $sections[1]; 

     if (preg_match('/^Content-Encoding: gzip/mi', $headers)) { 
      printf("gzip header found\n"); 
      return gunzip($data); 
     } 
     } 

     return $ret;