2017-11-16 1 views
0

Ich bin mit einem Speicherbegrenzungsfehler in meinem WordPress-Plugin-Code konfrontiert.

Mein Code:Wenn ich eine ZIP-Datei eines Verzeichnisses mit einer großen Zip-Datei in PHP erstelle, stehe ich einem Speicherlimit gegenüber

function zipData($source, $destination) { 
    if (extension_loaded('zip')) { 
     if (file_exists($source)) { 
      $zip = new ZipArchive(); 
      if ($zip -> open($destination, ZipArchive::CREATE) === TRUE)  { 
       $source = realpath($source); 
       if (is_dir($source)) { 
        $iterator = new RecursiveDirectoryIterator($source); 

        $iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS); 
        $files = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST); 
        foreach ($files as $file) { 
         $file = realpath($file); 
         if (is_dir($file)) { 
          $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); 
         } else if (is_file($file)) { 
          $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); 
         } 
        } 
       } else if (is_file($source)) { 
        $zip->addFromString(basename($source), file_get_contents($source)); 
       } 
      } 
      return $zip->close(); 
     } 
    } 
    return false; 
} 

ini_set('max_execution_time', 600); 
ini_set('memory_limit','1024M'); 
zipData($upload_dir['basedir'], $upload_dir['basedir'].'/Jincowboy/JinBackupMedia'. time() .'.zip'); 

traf ich eine Speichergrenze, damit ich Google überprüft.

Ich habe festgestellt, dass Stream-Zip-Datei-Generierung benötigt wird, um das Speicherlimit zu vermeiden, aber ich konnte dies nicht bestätigen.

Ich möchte, dass mein Code dieses Speicherlimit umgeht und die Erstellung einer ZIP-Datei basierend auf einem Verzeichnis mit großen Dateien ermöglicht.

Wie kann ich das beheben?

+0

Sie sollten das noch einmal versuchen, fügen Sie den Code ein, wählen Sie ihn aus und klicken Sie auf die Schaltfläche "Codebeispiel" ... – jeroen

+0

Ich versuche große Dateiaufteilung. aber ich weiß nicht, dass es eine Zeitüberschreitung und einen Speicherausbau oder eine Speicherbegrenzung haben wird. – Jincowboy

+0

Ich habe Speicherlimit und nicht genügend Speicher in der Funktion file_get_contents erlaubt. also habe ich das $ in = @fopen ($ file, "r"); while ($ buff = fgets ($ in, 4096)) { $ zip-> addFromString (str_replace ($ source. '/', '', $ File), $ buff); } fclose ($ datei); Aber es funktioniert nicht – Jincowboy

Antwort

-1

Sie können versuchen, https://github.com/Grandt/PHPZip, die Erstellung von ZIP-Dateien mit Streaming-Daten unterstützt (Verringerung der Speicherauslastung durch eine Menge).

Und es gibt viele Stackoverflow-Beiträge über das Zippen mit Streams mit einer Pletora von Antworten.

+0

Ich überprüft https://github.com/Grandt/PHPZip Die größten Dateien, die hinzugefügt werden können, sind 4 GB und die Summe Die Größe des Archivs darf 4 GB nicht überschreiten. Also ist es unmöglich. Ich möchte eine beliebige Größe Dateiverzeichnis in ZIP-Datei. – Jincowboy

+0

Die gesamte Größenbeschränkung ist entweder auf FAT32 basiert oder wenn in der ganzen Sache im Speicher ist, PHP 32 Bit-Engine, wenn Sie auf EXT3/4 auf Linux oder NTFS diese Beschränkung ist nicht in der Nähe. Wenn Sie 64-Bit-PHP verwenden, ist die Speicherkapazität des Computers begrenzt. – DevionNL

+0

Danke für deinen Kommentar, DevionNL. Aber Wordpress-Plugin sollte überall gut funktionieren – Jincowboy

Verwandte Themen