2012-01-17 18 views
14

असम्पीड्रेस मैं HTTP अनुरोध करने के लिए php के file_get_contents() फ़ंक्शन का उपयोग कर रहा हूं। बैंडविड्थ को सहेजने के लिए मैंने stream_context_create() का उपयोग करके "Accept-Encoding: gzip" शीर्षलेख जोड़ने का निर्णय लिया।gzip संपीड़ित http प्रतिक्रिया

जाहिर है, file_get_contents() एक gzip एन्कोडेड स्ट्रिंग आउटपुट करता है इसलिए मैं एन्कोडेड स्ट्रिंग को डीकोड करने के लिए gzuncompress() का उपयोग कर रहा हूं लेकिन मुझे तर्क के रूप में पारित डेटा के साथ एक त्रुटि मिलती है।

[...] PHP Warning: gzuncompress(): data error in /path/to/phpscript.php on line 26 

मैं जानता हूँ कि एक और समारोह Gzipped डेटा को संपीड़ित करने में सक्षम नहीं है gzdecode() लेकिन यह मेरी PHP संस्करण में शामिल नहीं है (शायद यह SVN पर ही उपलब्ध है)।

मुझे पता है कि सीयूआरएल फ्लाई पर किसी भी समस्या के बिना gzip स्ट्रीम डीकोड करता है लेकिन किसी ने मुझे CUrl के बजाय file_get_contents() का उपयोग करने का सुझाव दिया।

क्या आप PHP में gzipped डेटा को डिकंप्रेस करने का कोई अन्य तरीका जानते हैं या gzuncompress() चेतावनी आउटपुट क्यों करते हैं? यह बेतुका है कि gzuncompress() अपेक्षा के अनुसार काम नहीं करता है।

नोट्स: समस्या निश्चित रूप से PHP के बारे में है: HTTP अनुरोध टंबलर एपीआई में किया जाता है जो एक अच्छी तरह से एन्कोडेड प्रतिक्रिया देता है।

+0

क्या आप जानते हैं क्यों वे उपयोग करने के लिए सुझाव दिया है 'बजाय file_get_contents' सीआरआरएल का? – Jonathan

+0

नहीं, मुझे नहीं पता, उन्होंने कहा "यह बेहतर है"। मैं cUrl पर वापस जा सकता हूं लेकिन मैं gzuncompress() मुद्दे के बारे में उत्सुक हूं। –

+0

क्या ऐसा इसलिए है क्योंकि डेटा बेस 64 एन्कोडेड भी है? –

उत्तर

12

gzuncompressgzip एन्कोडिंग के लिए काम नहीं करेगा। यह .Z अभिलेखागार के लिए डिकंप्रेशन फ़ंक्शन है।

मैनुअल gzdecode()#82930 गायब के लिए कुछ कामकाज सूचीबद्ध करता है, या केवल upgradephp, या gzopen temp फ़ाइल वर्कअराउंड से उपयोग करें।

एक और विकल्प deflate एन्कोडिंग Accept-Encoding: शीर्षलेख के साथ एन्कोडिंग और फिर gzinflate() का उपयोग डिकंप्रेशन के लिए कर रहा है।

+0

मैं एक ओपन सोर्स लाइब्रेरी विकसित कर रहा हूं इसलिए मैं उपयोगकर्ताओं को उन्नयन स्थापित करने के लिए मजबूर नहीं कर सकता। लाइब्रेरी इंस्टॉलेशन जितना संभव हो उतना आसान होना चाहिए, इसलिए मैं cUrl का उपयोग करने के लिए बदल रहा हूं जिसमें अंतर्निहित gzip समर्थन है। –

+0

उम, क्या? यदि आप पूरे अपग्रेडफैप स्निपेट को साथ शिप नहीं करना चाहते हैं, तो आप उस एकल फ़ंक्शन कार्यान्वयन को कॉपी और पेस्ट कर सकते हैं। – mario

+0

मारियो, आपके सुझाव के लिए धन्यवाद लेकिन मैं अभी file_get_contents() कार्यान्वयन को छोड़कर cUrl पर बदल गया हूं। क्या आप सुनिश्चित हैं कि उन्नयन से gzdecode() आयात करना किसी भी अन्य निर्भरता के साथ काम करेगा? –

26

मेरे लिए यह काम कर रहे मिला: http://www.php.net/manual/en/function.gzdecode.php#106397

वैकल्पिक रूप से प्रयास करें: http://digitalpbk.com/php/file_get_contents-garbled-gzip-encoding-website-scraping

if (! function_exists('gzdecode')) 
{ 
    /** 
    * Decode gz coded data 
    * 
    * http://php.net/manual/en/function.gzdecode.php 
    * 
    * Alternative: http://digitalpbk.com/php/file_get_contents-garbled-gzip-encoding-website-scraping 
    * 
    * @param string $data gzencoded data 
    * @return string inflated data 
    */ 
    function gzdecode($data) 
    { 
     // strip header and footer and inflate 

     return gzinflate(substr($data, 10, -8)); 
    } 
} 
+2

सुंदर, मैं इस – AlBeebe

+0

के लिए पूरी खोज कर रहा हूं ऐसा लगता है कि gzinflate gzdecode के रूप में लचीला नहीं है। उदाहरण जो gzdecode के साथ काम करता है, लेकिन gzinflate के साथ नहीं: http://cdn.misterwhat.com/mwuk.min.gz.css?ver=3.1 – mgutt

+0

हां, यह काम करता है। यह मेरे लिए स्वीकार्य उत्तर होना चाहिए – realtebo

0

पहले decomress डेटा आप इसे इकट्ठा करने के लिए की जरूरत है। तो अगर हैडर

Transfer-Encoding: chunked 

आप इसे unchank करना है।

function http_unchunk($data) { 
    $res=[]; 
    $p=0; $n=strlen($data); 
    while($p<$n) { 
     if (preg_match("/^([0-9A-Fa-f]+)\r\n/",substr($data,$p,18),$m)) { 
      $sz=hexdec($m[1]); $p+=strlen($m[0]); 
      $res[]=substr($data,$p,$sz); $p+=$sz+2; 
     } else { 
      break; 
     } 
    } 
    return implode('',$res); 
} 

यदि सामग्री-एन्कोडिंग gzip है या एक्स-gzip या एक्स-संपीड़ित उपयोग gzdecode यदि सामग्री-एन्कोडिंग हवा निकालना उपयोग gzdeflate

... 
if ($chunked) $body=http_unchunk($body); 
if ($gzip) $body=gzdecode($body); 
if ($deflate) $body=gzdeflate($body); 
... 
संबंधित मुद्दे