2011-05-20 29 views
46

मैं PHP का उपयोग कर अपने सर्वर पर एक फ़ाइल को संकुचित करना चाहता हूं। क्या किसी के पास ऐसा उदाहरण है जो फ़ाइल को इनपुट करेगा और संपीड़ित फ़ाइल आउटपुट करेगा?PHP का उपयोग करके आप .gz फ़ाइल कैसे बनाते हैं?

उत्तर

69

अन्य उत्तरों यहां संपीड़न के दौरान पूरी फ़ाइल को स्मृति में लोड करते हैं, जिससे 'मेमोरी' बड़ी फ़ाइलों पर त्रुटियों का कारण बन जाएगा। नीचे दिए गए फ़ंक्शन को बड़ी फ़ाइलों पर अधिक विश्वसनीय होना चाहिए क्योंकि यह 512 केबी भाग में फ़ाइलों को पढ़ता है और लिखता है। gzencode() साथ

/** 
* GZIPs a file on disk (appending .gz to the name) 
* 
* From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php 
* Based on function by Kioob at: 
* http://www.php.net/manual/en/function.gzwrite.php#34955 
* 
* @param string $source Path to file that should be compressed 
* @param integer $level GZIP compression level (default: 9) 
* @return string New filename (with .gz appended) if success, or false if operation fails 
*/ 
function gzCompressFile($source, $level = 9){ 
    $dest = $source . '.gz'; 
    $mode = 'wb' . $level; 
    $error = false; 
    if ($fp_out = gzopen($dest, $mode)) { 
     if ($fp_in = fopen($source,'rb')) { 
      while (!feof($fp_in)) 
       gzwrite($fp_out, fread($fp_in, 1024 * 512)); 
      fclose($fp_in); 
     } else { 
      $error = true; 
     } 
     gzclose($fp_out); 
    } else { 
     $error = true; 
    } 
    if ($error) 
     return false; 
    else 
     return $dest; 
} 
+0

परफेक्ट करने के लिए बिल्कुल सही है! बस मुझे जो चाहिए था। – Clox

+0

आप सबसे अच्छे हैं! – Fuser97381

+0

कोड का बहुत अच्छा हिस्सा। मैंने उपरोक्त लिया और फ़ाइल को डीकंप्रेस करने के लिए रिवर्स बनाया। कोड काफी तेज़ है। – user3759531

91

इस कोड चाल

// Name of the file we're compressing 
$file = "test.txt"; 

// Name of the gz file we're creating 
$gzfile = "test.gz"; 

// Open the gz file (w9 is the highest compression) 
$fp = gzopen ($gzfile, 'w9'); 

// Compress the file 
gzwrite ($fp, file_get_contents($file)); 

// Close the gz file and we're done 
gzclose($fp); 
+9

:-) –

+10

अपने खुद के सवाल का जवाब देने दुर्भाग्य से यह शायद स्मृति में पूरी फ़ाइल, संभवतः बड़ी फ़ाइलों पर पीएचपी की स्मृति सीमा तक पहुंच गए पढ़ा जाएगा के लिए +1। :-( –

+0

जबकि w9 उच्चतम संपीड़न है? जो सबसे कम संपीड़न है, केवल .gz में डेटा पैक करने के लिए? – AMB

19

भी करता है, आप के लिए php के wrappers, compression ones इस्तेमाल कर सकते हैं। कोड में न्यूनतम परिवर्तन के साथ आप gzip, bzip2 या ज़िप के बीच स्विच करने में सक्षम होंगे।

$input = "test.txt"; 
$output = $input.".gz"; 

file_put_contents("compress.zlib://$output", file_get_contents($input)); 

compress.zlib:// ज़िप संपीड़न के लिए compress.zip:// करने के लिए परिवर्तन (देखें ज़िप संपीड़न के बारे में इस सवाल का जवाब करने के लिए टिप्पणी), या compress.bzip2:// को bzip2 संपीड़न के।

+0

मुझे लगता है कि 'compress.zip: //' संपीड़न के लिए समर्थित नहीं है। Http: // www पर नोट देखें। php.net/manual/en/wrappers.compression.php – Alex

+0

@ एलेक्स हां, ऐसा लगता है कि आप सही हैं, और ज़िप: // रैपर लेखन का समर्थन नहीं करता है और न ही पहले से मौजूद फाइल –

5

सरल एक लाइनर:

gzencode(file_get_contents($file_name)); 
3

तुम सिर्फ एक फ़ाइल अनज़िप करने, इस काम करता है और स्मृति के साथ मुद्दों का कारण नहीं है देख रहे हैं:

$bytes = file_put_contents($destination, gzopen($gzip_path, r)); 
1

यह शायद है कई लोगों के लिए स्पष्ट है, लेकिन यदि आपके सिस्टम पर कोई भी प्रोग्राम निष्पादन फ़ंक्शन सक्षम है (exec, system, shell_exec), तो आप उन्हें सिम्प के लिए उपयोग कर सकते हैं ly gzip फ़ाइल।

exec("gzip ".$filename); 
+0

निष्पादन सबसे अधिक लॉक हो गया है होस्टिंग प्लेटफ़ॉर्म और सामान्य रूप से एक सुरक्षा जोखिम है जो कि – Wranorn

+0

@Wranorn का उपयोग करने के लिए भी है, इसलिए मैंने संकेत दिया "यदि कोई प्रोग्राम निष्पादन कार्य ई है आपके सिस्टम पर सक्षम, "क्या मुझे आपके होस्टिंग प्लेटफ़ॉर्म पर" लिखा जाना चाहिए? सुरक्षा के लिए, यदि आप इस फ़ंक्शन में उपयोगकर्ता इनपुट पास नहीं करते हैं, तो मुझे यकीन नहीं है कि जोखिम क्या है। [PHP दस्तावेज़] (http://php.net/manual/en/function.exec.php) में केवल चेतावनियां उपयोगकर्ता द्वारा प्रदत्त डेटा को पास करते समय 'escapeshellarg()' या 'escapeshellcmd()' का उपयोग करने के बारे में हैं समारोह। – Niavlys

संबंधित मुद्दे