Ankündigung

Einklappen
Keine Ankündigung bisher.

zip - hört bei 55 MB Archivgröße auf Dateien hinzuzufügen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • zip - hört bei 55 MB Archivgröße auf Dateien hinzuzufügen

    Moin,

    ich hab bei uns in der Firma ein automatisches Produktbilderhochladeskript geschrieben. Ich kopiere alle Bilder, die sich seit timestamp xyz geändert haben, in ein export Verzeichnis und dieses will ich zippen, damit ich die ZIP dann auf unseren Webserver hochladen kann. Mein Problem besteht zur Zeit darin, dass bei einer Archivgröße von 55 MB keine Dateien mehr hinzugefügt werden. Die ZIP Funktion addFile gibt ab dort auch ein false zurück.

    Kann ich diese Beschränkung irgendwie konfigurieren ?

  • #2
    Welche Extension benutzt du zum zippen?

    Kommentar


    • #3
      Die in php dabei ist:

      PHP Version 5.2.6-3
      System: Linux/Debian (testing)

      Zip enabled
      Extension Version $Id: php_zip.c,v 1.1.2.43 2008/01/18 00:51:38 pajoye Exp $
      Zip version 1.8.11
      Libzip version 0.8.0-compatible

      Kommentar


      • #4
        memory_limit oder execution_time vielleicht ?

        Vielleicht mal speicherverbrauch und scriptlaufzeit in ne externe log schreiben lassen während das script läuft.


        Sollte es Speicher sein:
        Machst du noch weitere Dinge mit den Bildern ? Verkleinern oder sowas ? vielleicht irgendwo noch ungenutzte Variablen die du mit unset während dem Ablauf löschen kannst ?

        Kommentar


        • #5
          Das Skript dient nur dazu die aktualisierten Bilder alle in eine zip zu packen. Mehr nicht. Ist einfach komfortabler wenn ich nur eine Datei hochladen brauch

          memory_limit ist auf 256 MB angehoben. set_time_limit ist sowieso bei mir auf 0 (unlimited). Selbes Ergebnis.

          Kann ich nur noch evtl eins machen:

          Nach jedem addFile die Archivgröße prüfen und wenn diese 50 MB erreicht hat eine Funktion in meiner Klasse aufrufen die ein neues Archiv anlegt. Sozusagen ne Art volume Archiv erstelle.

          Kommentar


          • #6
            Das war ein glatter Fehlschlag. Kann das Archiv leider nicht wirklich testen, da beim packen eine temporäre Datei benutzt wird und diese natürlich immer anders heißt.

            Kommentar


            • #7
              Zitat von DonTermi Beitrag anzeigen
              Das Skript dient nur dazu die aktualisierten Bilder alle in eine zip zu packen. Mehr nicht. Ist einfach komfortabler wenn ich nur eine Datei hochladen brauch

              memory_limit ist auf 256 MB angehoben. set_time_limit ist sowieso bei mir auf 0 (unlimited). Selbes Ergebnis.

              Kann ich nur noch evtl eins machen:

              Nach jedem addFile die Archivgröße prüfen und wenn diese 50 MB erreicht hat eine Funktion in meiner Klasse aufrufen die ein neues Archiv anlegt. Sozusagen ne Art volume Archiv erstelle.
              hmm mal im error-log vom webserver (falls es über den Browser läuft) und php-errorlog (falls aktiviert) schauen ob dort etwas auftaucht, ansonsten vielleicht mal ein bißchen code zeigen.

              Kommentar


              • #8
                hi,

                da gibts nen schönen kommentar im php manual:

                Currently the number of files that can be added using addFile to the ZIP archive (until it is closed) is limited by file descriptors limit. This is an easy workaround (on the bug links below you can find another workarounds):
                unds präsentiert auch nen workaround:

                PHP-Code:
                <?php
                /** work around file descriptor number limitation (to avoid failure
                * upon adding more than typically 253 or 1024 files to ZIP) */
                function addFileToZip$zip$path$zipEntryName ) {
                // this would fail with status ZIPARCHIVE::ER_OPEN
                // after certain number of files is added since
                // ZipArchive internally stores the file descriptors of all the
                // added files and only on close writes the contents to the ZIP file
                // see: http://bugs.php.net/bug.php?id=40494
                // and: http://pecl.php.net/bugs/bug.php?id=9443
                // return $zip->addFile( $path, $zipEntryName );
                $contents file_get_contents$path );
                if ( 
                $contents === false ) {
                return 
                false;
                }
                return 
                $zip->addFromString$zipEntryName$contents );
                }

                Kommentar


                • #9
                  nope, keine Error Messages.

                  Der Code ist nicht anderes als

                  $zip = new ZipArchive;

                  und dann einfach ne Funktion die ein Verzeichnis rekursiv durchforstet und ein

                  $zip->addEmptyDir ...
                  und
                  $zip->addFile...

                  macht. Mehr ist das nicht. Diese temporäre Datei habe ich jetzt umgangen. Benutze einfach in der Klasse noch eine zusätzliche Variable für die erfaßten Dateigrößen. Ich addiere einfach die zu packende Dateigröße in diese Variable "current_archive_size" und sobald diese die split_size überschreitet wird eine neues Archiv angelegt. So richtet sich der Split zwar nach der wirklich Dateigröße, aber es funktioniert erstmal.

                  Kommentar


                  • #10
                    @brian johnson

                    Danke. Habe mal addFromString eingebaut statt addFile. Jetzt gehts. Liegt wirklich am file descriptors limit. Bin grad am suchen wo das in der Manual steht

                    Kommentar


                    • #11
                      Zitat von DonTermi Beitrag anzeigen
                      @brian johnson

                      Danke. Habe mal addFromString eingebaut statt addFile. Jetzt gehts. Liegt wirklich am file descriptors limit. Bin grad am suchen wo das in der Manual steht
                      >> hier ganz unten

                      Kommentar


                      • #12
                        @brian johnson

                        Wie dort auch in der man stand ist file_get_contents schlecht bei großen Dateien. Ich mache zwar nen unset nach dem addFromString aber trotdem ist sense wenn die Archivgröße meine memory_limit size übersteigt. Daher keine wirkliche Lösung.

                        Kommentar


                        • #13
                          Bleibt nur noch meine Funktion des manuellen Splits übrig. Da geht es wenigstens

                          Kommentar


                          • #14
                            hmm alternativ wenn du genug Rechte/Zugriff auf dem System hast
                            -> via exec einen packer deiner wahl ausführen, ist wahrscheinlich einfacher und schneller und kollidiert auch nicht mit memory_limit oder ähnlichem.

                            Kommentar


                            • #15
                              @robo47

                              Jo. Der Server auf dem das gemacht wird steht 1 Raum weiter und ich bin das Sysadmin Damit wäre ein exec kein Problem.

                              ABER: Da dieses File auf einen Webserver kommt der nicht bei uns steht kann ich leider nicht sagen ob der dann bei dieser Archivgröße Probleme machen würde.

                              Kommentar

                              Lädt...
                              X