I am trying to unzip a 14 MB archive with PHP with code like this:
$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); }
It does not work on my local host with a 128 MB memory limit with the classic " Allowed memory size of blablabla bytes exhausted ". I have a 16 MB limit on the server, is there a better way to do this so that I can fit into that limit? I do not understand why this should allocate more than 128 MB of memory. Thanks in advance.
Solution: I started reading files in 10Kb chunks, the problem was solved using arnoud 1.5MB peak memory.
$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); }
php unzip
cypher
source share