2010-07-16 11 views
6

साथ Unzipping बड़ी फ़ाइलों मैं इस तरह कोड के साथ PHP के साथ एक 14MB संग्रह अनज़िप करने के लिए कोशिश कर रहा हूँ:पीएचपी

$zip = zip_open("c:\kosmas.zip"); 
    while ($zip_entry = zip_read($zip)) { 
    $fp = fopen("c:/unzip/import.xml", "w"); 
    if (zip_entry_open($zip, $zip_entry, "r")) { 
    $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); 
    fwrite($fp,"$buf"); 
    zip_entry_close($zip_entry); 
    fclose($fp); 
    break; 
    } 
    zip_close($zip); 
    } 

यह क्लासिक "Allowed memory size of blablabla bytes exhausted" के साथ 128MB स्मृति सीमा के साथ मेरी स्थानीय होस्ट पर विफल रहता है। सर्वर पर, मुझे 16 एमबी सीमा मिली है, क्या ऐसा करने का एक बेहतर तरीका है ताकि मैं इस सीमा में फिट हो सकूं? मुझे नहीं लगता कि इसे 128 एमबी से अधिक स्मृति आवंटित क्यों किया गया है। अग्रिम में धन्यवाद।

समाधान: मैं 10kb हिस्सा, समस्या शिखर स्मृति उपयोग अर्नोउड 1.5MB के साथ हल में फ़ाइलों को पढ़ना शुरू किया।

 $filename = 'c:\kosmas.zip'; 
     $archive = zip_open($filename); 
     while($entry = zip_read($archive)){ 
      $size = zip_entry_filesize($entry); 
      $name = zip_entry_name($entry); 
      $unzipped = fopen('c:/unzip/'.$name,'wb'); 
      while($size > 0){ 
       $chunkSize = ($size > 10240) ? 10240 : $size; 
       $size -= $chunkSize; 
       $chunk = zip_entry_read($entry, $chunkSize); 
       if($chunk !== false) fwrite($unzipped, $chunk); 
      } 

      fclose($unzipped); 
     } 
+0

ज़िप फ़ाइल का * असम्पीडित * आकार क्या है? –

+0

कमांड लाइन टूल्स का उपयोग कर एक विकल्प है? –

+0

असंपीड़ित आकार लगभग 110 एमबी है। दुर्भाग्यवश, कमांड लाइन का उपयोग करना एक विकल्प नहीं है। – cypher

उत्तर

4

आप पूरी फाइल को एक बार में क्यों पढ़ते हैं?

$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); 
fwrite($fp,"$buf"); 

इसके छोटे हिस्सों को पढ़ने और उन्हें फ़ाइल में लिखने का प्रयास करें।

+0

यह वही है जो मैंने किया था और यदि कोई दिलचस्पी लेता है, तो मैं एक मिनट में समाधान पोस्ट कर रहा हूं। – cypher

1

सिर्फ इसलिए कि एक ज़िप पीएचपी की स्मृति सीमा & से भी कम है शायद अनज़िप रूप में अच्छी तरह, आम तौर पर और अधिक महत्वपूर्ण PHP के भूमि के ऊपर के कारण नहीं ले करता है स्मृति की जरूरत वास्तव में फ़ाइल है, जो जब मैं अनज़िप करने के लिए है मैं संपीड़न के साथ विशेषज्ञ नहीं हूं, मैं उम्मीद करता हूं कि अंतिम अनजिप आकार से भी बहुत कुछ हो सकता है।

shell_exec('unzip archive.zip -d /destination_path'); 

पीएचपी सुरक्षित मोड में नहीं चलना चाहिए और आप दोनों shell_exec के लिए उपयोग किया है और इस के लिए अनज़िप चाहिए:

+0

हां, लेकिन हमेशा एक विकल्प प्रतीत होता है, यानी मैं 1 एमबी से कम चोटी मेमोरी उपयोग के साथ बहुत बड़ा संग्रह अनजिप कर सकता हूं, मैं 3 जीबी से कम चोटी मेमोरी उपयोग के साथ 1.5 जीबी एक्सएमएल फाइल पार्स कर सकता हूं, ऐसा विकल्प क्यों नहीं हो सकता ज़िप फ़ाइलों के लिए ... – cypher

0

है कि आकार की एक फ़ाइल के लिए, शायद यह अगर तुम shell_exec() बजाय का उपयोग बेहतर है काम करने के लिए विधि।

अद्यतन:

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

+0

दुर्भाग्यवश, सर्वर द्वारा कमांड लाइन उपकरण अक्षम हैं। – cypher

+0

@ एनाक्स यही कारण है कि PHP को एक खराब लपेटें मिलती है। कमांडलाइन तर्क चलाने के लिए कभी भी उत्पादन अनुप्रयोग को क्यों आवश्यकता होनी चाहिए? यह इतने सारे PHP कीड़े का सिद्धांत स्रोत है। –

0
function my_unzip($full_pathname){ 

    $unzipped_content = ''; 
    $zd = gzopen($full_pathname, "r"); 

    while ($zip_file = gzread($zd, 10000000)){ 
     $unzipped_content.= $zip_file; 
    } 

    gzclose($zd); 

    return $unzipped_content; 

} 
+1

इस समाधान के पीछे कोई स्पष्टीकरण या तर्क समस्या को समझने में सहायक हो सकता है। – PiotrWolkowski

+0

इसके अलावा, इसका उत्तर ** ** ** साल पहले दिया गया है। – cypher