Ankündigung

Einklappen
Keine Ankündigung bisher.

imagecreatefromjpeg() "Allowed memory size exhausted"

Einklappen

Neue Werbung 2019

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

  • imagecreatefromjpeg() "Allowed memory size exhausted"

    Hallo.
    Ich habe eine Uploadfunktion für mein Fotoalbum. Man kann dort Fotos hochladen, die dann verkleinert gespeichert werden sollen. An sich funktioniert auch alles. Nur wenn die Bilder eine gewisse Größe übersteigen, wird aus dem verkleinern nichts.

    Fehlermeldung:
    "Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 10240 bytes) in ... on Line..."
    Dort steht imagecreatefromjpeg().

    Jetzt würde ich gerne wissen, ob das am Quellcode liegt (unsaubere Programmierung oder sowas) oder ob ich nichts dagegen tun kann und damit leben muss, dass der zur Verfügung gestellte Speicher nicht reicht.

    Ich habe den Quellcode mal um den überflüssigen Schnickschnack erleichtert:

    PHP-Code:
    <?php

    $path 
    "./Fotoalben/".$_POST['dir']."/".$_FILES['foto']['name'];

    if(!
    file_exists($path)){

        
    move_uploaded_file($_FILES['foto']['tmp_name'], $path);
        
        
    $size getimagesize($path);
        
    $oldwidth $size[0];
        
    $oldhight $size[1];
        if(
    $oldwidth <= $oldhight){
        
            
    $hight 550;
            
    $width intval($oldwidth*$hight/$oldhight);
        }
        else{
        
            
    $width 550;
            
    $hight intval($oldhight*$width/$oldwidth);
        }
        
        if(
    $oldwidth or $oldhight 550){
            
            
    $input=imagecreatefromjpeg($path);
            
    $output=imagecreatetruecolor($width,$hight);
            
    imagecopyresampled($output,$input,0,0,0,0,$width,$hight,$oldwidth,$oldhight);
            
    imagejpeg($output$path);
        }
    }
    ?>

    Peter Silie


  • #2
    Kann schon sein. 24MB sind auch nicht wirklich viel RAM und die GDLib lädt jedes einzelne Pixel in den Speicher, womit es den gleichen Raum einnimmt wie ein adäquates BMP-File. Da kann je nach Auflösung ein von der eigentlichen Dateigröße her gesehen recht kleines Bild den Speicher schnell füllen.
    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

    Kommentar


    • #3
      Vor allen Dingen, wenn du kein imagedestroy aufrufst... du erzeugst dir ein Memory Leak
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Nicht zwangsläufig. Wenn PHP sich beendet, werden auch die Ressourcen freigegeben, aber wenn man mit hochauflösenden Bildern arbeitet, sollte man, wenn möglich, nach jeder Aktion die Ressource mit imagedestroy() freigeben. Einfach die Variable zu überschreiben reicht übrigens nicht. Dann hat man sich den Pointer auf die Ressource zerstört, das Bild bleibt aber im Speicher.
        Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

        Kommentar


        • #5
          Danke erstmal für den Hinweis mit imagedestroy(). Ich verstehe das jetzt so, dass ich imagedestroy() für die beiden erzeugten Bilder ($input und $output) aufrufen sollte, nachdem ich das verkleinerte Bild abgespeichert hab. (bzw. nach imagecopyresampled())
          Das würde an dem Problem doch sicher nichts ändern, da quasi Speicher fehlt, bevor ich überhaupt welchen freigeben kann.
          Gibt es eine andere Möglichkeit, Bilder zu verkleinern, die vielleicht nicht so "speicherintensiv" ist? (ich glaube zwar nicht, aber man kann ja mal fragen)

          Peter Silie

          Kommentar


          • #6
            Wenn schon das Laden eines einzigen Bildes den Speicher überbeansprucht, gibt es nur zwei Möglichkeiten: PHP über die php.ini mehr Speicher zur Verfügung stellen oder ImageMagick statt GDLib nutzen.
            Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

            Kommentar


            • #7
              Ich schreib das mal hier rein, da ich denke, dass ich ein ähnliches Problem habe.
              Vorweg möchte ich erwähnen, dass ich php gerade erst lerne und ich ein Script mit verschiedenen Tutorials und dem php-Manual geschrieben habe.

              Aufgabe des Scripts ist es, eine ziemlich große Menge (zwischen 800 und 1500) von Bildern zu verkleinern, verschieben und anschließend eine Zip-Datei zu erstellen.
              Ich poste das Script erst mal und gehe dann genauer darauf ein:

              PHP-Code:
              <?php 
              error_reporting
              (E_ALL);
              ini_set('display_errors','On');
              if (
              function_exists('ini_get') && ini_get('date.timezone') == '') {
                  
              ini_set('date.timezone''Europe/Berlin');
              }
              $script_start =  time();

              if( !
              ini_get('safe_mode') ){
                  
              set_time_limit(3600);

              echo 
              '<br />';

              // Pfade
              $absPath $_SERVER['DOCUMENT_ROOT'];
              $watchPath $absPath '/flo/'// Pfad zum Watchfolder
              $watchDir =  $watchPath '_watchFolder/'// Ordnername (_watchFolder)

              //#################################### 
              //          Mail-Variablen           #
              //####################################
              $absender "email@domain.de";
              $empfaenger $absender;
              $mailbetreff "aktualisierte Produktbilder";
              $mailnachricht "\nDatum/Zeit: ";
              $mailnachricht .= date("d.m.Y H:i:s")."\n\n";
              $mailnachricht .= "Folgende Bilder wurden aktualisiert: \n\n";


              //#################################### 
              //         BCC-Liste auslesen        #
              //####################################
              $csv fopen($watchPath "Mailverteiler.csv""r");
              $bcc '';
              while (
              $array fgetcsv($csv1024";")){
                   
              $bcc .= 'Bcc: ' $array[2] . "\r\n"//Mailadresse steht in der dritten Spalte der CSV-Datei
              }
              fclose ($csv);

              //#################################### 
              //     Bildnamen ins $filaeArray     #
              //####################################
              $fileArray = array(); 
              $handle opendir($watchDir); 
              $i=0
              while(
              $file readdir($handle)) { 
                  if(
              $file == "." || $file == "..") continue;     
                  
              $fileArray[$i] = $file// Bildnamen ins $fileArray schreiben
                  
              $mailnachricht .= $file "\n"//Dateien in den Mail-Text anhängen
                  
              $i++;
              }
              closedir($handle); 

              //#################################### 
              //      Backup vom Watchfolder       #
              //####################################
              if (count($fileArray != 0)){
                  
              $timestamp time();
                  
              $datum date("Ymd",$timestamp);
                  
              $ordnername $datum '_watchFolder';
                  if (!
              is_dir($watchPath $ordnername)){
                      if (!
              mkdir($ordnername0700)) echo 'Keinen Ordner erstellt! <br />';
                      for ( 
              $i 0$i count($fileArray); $i++){
                          
              copy($watchDir $fileArray[$i], $watchPath $ordnername '/' $fileArray[$i]);
                      }
                  } else {
                      echo 
              'Der Ordner ' $ordnername ' existiert bereits. <br />';
                  }
              }

              //#################################### 
              //  Daten-Array anlegen und fuellen  #
              //####################################
              if($i!=0) {
                  
              $allArray = array();

                  
              // 1000 x 1000 - Info bereich
                  
              $allArray[0]['h'] = 1000;    
                  
              $allArray[0]['w'] = 1000;
                  
              $allArray[0]['typ'] = 'jpg';
                  
              $allArray[0]['name'] = $allArray[0]['h'] . 'x' $allArray[0]['w'] . '-' $allArray[0]['typ'];
                  
                  
              //600 x 600 - Store Categories - popup_images
                  
              $allArray[1]['h'] = 600;
                  
              $allArray[1]['w'] = 600;
                  
              $allArray[1]['typ'] = 'jpg';
                  
              $allArray[1]['name'] = $allArray[1]['h'] . 'x' $allArray[1]['w'] . '-' $allArray[1]['typ'];
                  
                  
              // 370 x 370 - Store Categories - info_images
                  
              $allArray[2]['h'] = 370;
                  
              $allArray[2]['w'] = 370;
                  
              $allArray[2]['typ'] = 'jpg';
                  
              $allArray[2]['name'] = $allArray[2]['h'] . 'x' $allArray[2]['w'] . '-' $allArray[2]['typ'];
                  
                  
              // 144 x 144 - Store Categories - thumbnail_images
                  
              $allArray[3]['h'] = 144;
                  
              $allArray[3]['w'] = 144;
                  
              $allArray[3]['typ'] = 'jpg';
                  
              $allArray[3]['name'] = $allArray[3]['h'] . 'x' $allArray[3]['w'] . '-' $allArray[3]['typ'];
                  
                  
              // 370 x 370 - Store Products - info_images
                  
              $allArray[4]['h'] = 370;
                  
              $allArray[4]['w'] = 370;
                  
              $allArray[4]['typ'] = 'gif';
                  
              $allArray[4]['name'] = $allArray[4]['h'] . 'x' $allArray[4]['w'] . '-' $allArray[4]['typ'];

                  
              // 144 x 144 - Store Products - thumbnail_images

                  
              $allArray[5]['h'] = 144;
                  
              $allArray[5]['w'] = 144;
                  
              $allArray[5]['typ'] = 'gif';
                  
              $allArray[5]['name'] = $allArray[5]['h'] . 'x' $allArray[5]['w'] . '-' $allArray[5]['typ'];

                  
              //#################################### 
                  //    Unterverzeichnisse anlegen     #
                  //####################################
                  
              for ($i 0$i count($allArray); $i++){
                      if (!
              is_dir($watchPath $allArray[$i]['name'])){
                          if (!
              mkdir($watchPath $allArray[$i]['name'], 0700)) echo 'Der Ordner: ' $allArray[$i]['name'] . ' konnte nicht             erstellt werden! <br />';
                      }
                  }

                  
              //#################################### 
                  //  Bilder editieren und speichern   #
                  //####################################
                  //require_once 'ProgressBar.class.php5';  // ProgressBar by David Bongard
                  //$bar = new ProgressBar();  
                  //$elements = count($allArray) * count($fileArray); // Anzahl der Schleifendurchläufe  
                  //$bar->initialize($elements); // Initialisieren und leeren Fortschrittsbalken anzeigen

                  
              for ($i 0$i count($allArray); $i++){
                      for( 
              $j 0$j count($fileArray); $j++ ){
                          
              //echo '<div id="bar">Durchlauf: ' . $i . ' | Bild: ' . $j . '</div>';
                          
              $size getimagesize($watchDir $fileArray[$j]);
                          
              $w $size[0]; // Width des Originalbildes
                          
              $h $size[1]; // Height des Originalbildes
                      
                          // Seitenverhaltnisse + Verkleinerung
                          
              if ($h >= $w) {
                              
              $wn round($w/($h/$allArray[$i]['h']));
                              
              $hn $allArray[$i]['h'];
                          } else {
                              
              $wn $allArray[$i]['w'];
                              
              $hn round($h/($w/$allArray[$i]['w']));
                          }
                          
                          
              // Bilderstellung mit neuen Seitenverhaltnissen
                          
              $dst_img ImageCreateTrueColor($wn,$hn);
                          
              $dst_body imagecolorallocate$dst_img255255255 );
                          
              imagefill$dst_img,0,0,$dst_body );
                          
              $src_img ImageCreateFromJpeg($watchDir $fileArray[$j]);
                          
              ImageCopyResized($dst_img$src_img0000$wn$hn ,$w ,$h); // ImageCopyResampled
                          
                          // gif oder jpg schreiben
                          
              if ($allArray[$i]['typ'] == 'jpg'){
                              if(
              $allArray[$i]['h'] == 1000){
                                  
              imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.jpg');
                              } else {
                                  
              imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -8) . '.jpg');
                              }
                          } else {
                              
              imagegif($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.gif');            
                          }                
                          
              ImageDestroy($src_img);
                          
              ImageDestroy($dst_img);    
                          
                          
              //$bar->increase(); // Frotschrittsbalken    
                      

                  }

                  
              //#################################### 
                  //        Watchfolder leeren         #
                  //####################################
                  
              echo '<br />';
                  for (
              $i 0$i count($fileArray); $i++){
                      if(!
              unlink($watchDir $fileArray[$i])) {
                          echo 
              'Beim Loeschen der Datei '$fileArray[$i] . ' trat ein Fehler auf! <br />';
                      }
                  } 

                  
              //#################################### 
                  //        Zip-Datei erstellen        #
                  //####################################    
                  
              $zip $datum 'Aktualisierungen.zip';                                                                        
                  
              ob_start();    
                  require(
              './zip.lib.php');
                  
              $zipfile = new zipfile($zip);
                  
              $zipfile->addDirContent('1000x1000-jpg/');
                  
              file_put_contents($zip$zipfile->file());
                                                                                                                                                                                                                               
                  
              //#################################### 
                  //           Mail erstellen          #
                  //####################################
                  
              $mailnachricht .= 'Sie koennen die Bilder direkt unter: http://www.domain.de/flo/' $zip ' als zip-Archiv herunterladen.' "\n";
                  
              mail($empfaenger$mailbetreff$mailnachricht$bcc "From: ".$absender);    // Mail generieren
                  
              } else {
                  echo 
              'Der Ordner <i>"'$watchDir .'"</i> ist leer! Ich tu hier gar nichts<br />!';
                  
              mail($empfaenger'Cronejob - Done''Cronejob ausgeführt, keine neuen Bilder'"From: ".$absender);    // Mail generieren
              }

              $end_time time();
              echo 
              '<b>Erstellt in '.($end_time $script_start).' Sekunden</b><br />';
              ?>
              Da bei uns auf dem Server kein Safe-Mode aktiviert ist, habe ich die Laufzeit des Scripts einfach mal auf eine Stunde gestellt, um auszuschließen, dass es in einen timeout läuft.

              PHP-Code:
              $watchDir =  $watchPath '_watchFolder/'// Ordnername (_watchFolder) 
              Dieser Ordner (_watchFolder) soll mit den Bildern befüllt werden (die Größe der Bilder ist in dem Ordner 1000x1000 px) und wenn keine Bilder drin sind, wird auch nichts weiter gemacht. Das Script soll täglich via Cronejob angestoßen werden.

              Das wirkliche Problem tritt dann aber erst in den zwei for-Schleifen auf:
              PHP-Code:
                  for ($i 0$i count($allArray); $i++){
                      for( 
              $j 0$j count($fileArray); $j++ ){
                          
              //echo '<div id="bar">Durchlauf: ' . $i . ' | Bild: ' . $j . '</div>';
                          
              $size getimagesize($watchDir $fileArray[$j]);
                          
              $w $size[0]; // Width des Originalbildes
                          
              $h $size[1]; // Height des Originalbildes
                      
                          // Seitenverhaltnisse + Verkleinerung
                          
              if ($h >= $w) {
                              
              $wn round($w/($h/$allArray[$i]['h']));
                              
              $hn $allArray[$i]['h'];
                          } else {
                              
              $wn $allArray[$i]['w'];
                              
              $hn round($h/($w/$allArray[$i]['w']));
                          }
                          
                          
              // Bilderstellung mit neuen Seitenverhaltnissen
                          
              $dst_img ImageCreateTrueColor($wn,$hn);
                          
              $dst_body imagecolorallocate$dst_img255255255 );
                          
              imagefill$dst_img,0,0,$dst_body );
                          
              $src_img ImageCreateFromJpeg($watchDir $fileArray[$j]);
                          
              ImageCopyResized($dst_img$src_img0000$wn$hn ,$w ,$h); // ImageCopyResampled
                          
                          // gif oder jpg schreiben
                          
              if ($allArray[$i]['typ'] == 'jpg'){
                              if(
              $allArray[$i]['h'] == 1000){
                                  
              imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.jpg');
                              } else {
                                  
              imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -8) . '.jpg');
                              }
                          } else {
                              
              imagegif($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.gif');            
                          }                
                          
              ImageDestroy($src_img);
                          
              ImageDestroy($dst_img);    
                          
                          
              //$bar->increase(); // Frotschrittsbalken    
                      

                  } 
              Im XAMPP habe ich das Teil mit einer recht große Menge an Bildern getestet und es rennt problemlos durch, allerdings bekomme ich auf dem Webserver ab einer bestimmten Anzahl von Bildern (ab ca. 25 Bildern) eine "Error 500 - Internal server error" Fehlermeldung. Wenn ich statt ImageCopyResized ImageCopyResampled (was qualitativ eher mein Favorit wäre) nehme geschieht dies auch schon bei weniger Bildern.

              Jetzt habe ich mich bei 1&1 erkundigt, die mir sagten, dass folgende Einstllungen zu berücksichtigen sind:
              - Prozesse dürfen max. 10 Sekunden Rechenzeit beanspruchen
              - Prozesse dürfen max. 32 MB Speicher belegen. Bei Verwendung von PHP5 40 MB Speicher.
              - Es dürfen max. 12 Prozesse gleichzeitig laufen.
              Also vermute ich, dass ich diese Beschrenkungen offensichtlich nicht einhalten kann und habe wieder nach diesem Problem gegoogled und öfter mal gelesen, dass man das besser programmieren muss um Resourcen zu sparen. Irgend was mit Script sich selbst aufrufen lassen und sich merken, wo man war etc. allerdings weiß ich absolut nicht, wie ich das bei mir umsetzen soll. Mein erster Versuch einfach alle Variablen als $_Session-Variablen anzulegen ist kläglich gescheitert.

              Vielleicht kann mir hier noch jemand einen Hinweis geben, wie ich dieses Script so umschreiben kann, dass es nicht mittendrin einfach abbricht.
              Für jeden weiteren Hinweis auf Tutorials und Tips wäre ich echt dankbar.

              Gruß
              Flo

              Kommentar


              • #8
                Ok. Erstmal kommt es auf die Größe bzw. Auflösung (DPI) der Bilder an, wieviel RAM sie benötigen. Ein JPEG, das sehr hoch komprimiert wurde, aber in einer sehr hohen Auflösung vorliegt, kann durchaus ein großes Vielfaches der Speichermenge brauchen, die die Bilddatei auf der Festplatte belegt.

                Wo kommt der 500er Serverfehler her? LOG Dateien einsehen und Ursache herausfinden! Sollte es so sein, das ein Teil von PHP (GD Extension) diesen Fehler auslöst, kann auch das zu Speicherlecks führen.

                Irgend was mit Script sich selbst aufrufen lassen und sich merken, wo man war etc. allerdings weiß ich absolut nicht, wie ich das bei mir umsetzen soll. Mein erster Versuch einfach alle Variablen als $_Session-Variablen anzulegen ist kläglich gescheitert.
                Das ist eine typsiche "funzt nich" Fehlerbeschreibung. Welchen Ansatz hast du (hast du überhaupt einen) und was bedeutet kläglich gescheitert?

                Du könntest bereits bearbeitete Bilder verschieben und immer nur in Häppchen arbeiten. Oder du speicherst die Namen der bereits verarbeiteten Dateien in einer gesonderten Datei und verwendest die als Blacklist. Es gibt verschiedene Ansätze.

                Aufgabe des Scripts ist es, eine ziemlich große Menge (zwischen 800 und 1500) von Bildern zu verkleinern, verschieben und anschließend eine Zip-Datei zu erstellen.
                Ist das die Tages-Gesamtmenge, oder sind das bei jedem Aufruf des Scripts soviele? Wenn du bereits Informationen zu 1000 Dateien im Speicher hälst, bevor die eigentliche Bildverarbeitung startet, geht das natürlich von deinem zur Verfügung stehenden Speicher ab.
                das besser programmieren muss um Resourcen zu sparen
                Ja, darum gehts im wesentlichen.

                Kannst du externe Tools wie ImageMagick einsetzen?

                Protokollier mal den Speicherverbrauch an verschiedenen Stellen im Programm mit: zu Beginn, nach dem Einlesen des Verzeichnisses, zu Beginn jeder Bildbearbeitung und am Ende des Scriptes, nachdem alle Resourcen freigegeben wurden. Setz dazu auch explizit Arrays auf null. Das dürfte schon Aufschluß über die Entwicklung geben. Dazu immer die Ausmaße des Bildes (Breite, Höhe, DPI bzw. BPP) und den tatsächlichen Speicherverbrauch nach dem Laden. Es kann auch sein, das einige der GD Funktionen memory leaks enthalten - von ImageCreateFromJPEG wird das zumindest immer wieder behauptet.

                edit: Und benutz lieber eine Mailerklasse, nicht mail(), es ist reine Glückssache, wenn Mails damit ankommen...
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Zitat von lstegelitz Beitrag anzeigen
                  Ok. Erstmal kommt es auf die Größe bzw. Auflösung (DPI) der Bilder an, wieviel RAM sie benötigen.
                  Es kommt ausschließlich auf die Maße in Pixeln an. Für DPI interessiert sich die GDLib nicht (bzw. „Computergrafik“ allgemein) - das ist ein Wert, der Drucker interessiert.

                  Und die GDLib arbeitet intern mit 32 Bit, also 4 Byte pro Pixel (RGB+Transparenz).

                  Kommentar


                  • #10
                    Es kommt ausschließlich auf die Maße in Pixeln an. Für DPI interessiert sich die GDLib nicht (bzw. „Computergrafik“ allgemein) - das ist ein Wert, der Drucker interessiert.
                    Jep und Jain.
                    DPI heißt "Dots per Inch" und ist tatsächlich nur für die Print-Ausgabe gedacht. Eine weitere Größe, die aber aber oft synonym verwendet wird, ist PPI (Pixels per Inch). Dies ist für Computergrafik interessant, da hiermit a) die Pixeldichte auf Monitoren und damit b) die Erscheinungsgröße von Grafiken beeinflusst wird.
                    Die GDLib interessiert das aber natürlich nicht, das stimmt. Wozu sollte es auch, letztendlich definiert sich die PPI nur durch die absolute und metrische Größenangabe, die das Bild hat, sowie der Menge an Pixeln.
                    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                    Kommentar


                    • #11
                      Zitat von ChrisB Beitrag anzeigen
                      Es kommt ausschließlich auf die Maße in Pixeln an. Für DPI interessiert sich die GDLib nicht (bzw. „Computergrafik“ allgemein) - das ist ein Wert, der Drucker interessiert.

                      Und die GDLib arbeitet intern mit 32 Bit, also 4 Byte pro Pixel (RGB+Transparenz).
                      Also die Auflösung der Originalbilder beträgt 1000 x 1000 Pixel

                      Zitat von lstegelitz Beitrag anzeigen
                      Wo kommt der 500er Serverfehler her? LOG Dateien einsehen und Ursache herausfinden! Sollte es so sein, das ein Teil von PHP (GD Extension) diesen Fehler auslöst, kann auch das zu Speicherlecks führen
                      Das wollte ich herausfinden, daher kam auch die Mail an 1 & 1 zustande.
                      Ich hatte via Google einen Beitrag gefunden, wie man die Fehlermeldungen bei 1 & 1 in eine Datei umleitet, allerdings vermutete ich zu diesem Zeitpunkt, dass diese Fehlermeldung in den Apache Error-Logs sein müsste, an die ich nicht rankam.

                      Ich habe dann versucht in XAMPP die gleichen Werte in der php.ini zu benutzen, wie die auf dem Webserver, um diesen Fehler zu reproduzieren und vielleicht eine Fehlernachricht auf meinem PC finden zu können, doch leider Trat der Fehler lokal nicht auf, trotz der angepassten php.ini

                      Zitat von lstegelitz Beitrag anzeigen
                      Das ist eine typsiche "funzt nich" Fehlerbeschreibung. Welchen Ansatz hast du (hast du überhaupt einen) und was bedeutet kläglich gescheitert?
                      Wie das am Ende aussah, kann ich dir nicht mehr genau sagen, weil ich den Code rausgeschmissen habe, aber die Grundidee war, dass ich in den beiden For-Schleifen ein "header("Location: http://www.Link.zum/Script");" mache und die Zählvbariablen in einer Sessionvariable ablege, damit ich diese nach dem Aufruf wieder verwenden kann. Ich hab dann irgendwann versucht alle Variablen als Session-Variablen zu nutzen und da bekam ich bei Aufruf des Scripts nur noch 'ne weiße Seite. Da mir nicht wirklich klar war, ob dieser Ansatz überhaupt Sinn macht, habe ich das alles rückgängig gemacht und versucht mich auf das Problem zu konzentrieren, dass ich vielleicht einfach nicht gut programmiert habe und das alles vielleicht doch bei weitem zu Umständlich ist, daher habe ich mich dann hier registriert, um herauszufinden, ob ich total auf dem Holzweg bin, oder das schon in die richtige Richtung geht.

                      Zitat von lstegelitz Beitrag anzeigen
                      Ist das die Tages-Gesamtmenge, oder sind das bei jedem Aufruf des Scripts soviele? Wenn du bereits Informationen zu 1000 Dateien im Speicher hälst, bevor die eigentliche Bildverarbeitung startet, geht das natürlich von deinem zur Verfügung stehenden Speicher ab.
                      Diese Menge an Bildern wird es vermutlich nur 5-6 mal im Jahr geben, meist soll das Script nur nach aktualisierten (via Cronejob) Bildern, bzw überhaupt Bildern im _watchFolder gucken und wenn welche vorhanden sind diese in die einzelnen Ordner verteilen/resizen.

                      Wie gesagt, ich stapfe hier etwas im Dunklen.
                      Danke vielmals, die Sache mit den Speicherverbrauch werde ich noch mal testen, das hab ich auch schon mal gemacht.

                      Gruß
                      Flo

                      edit, habe mal einige Ausgaben gemacht zum Speicher (mit memory_get_usage()), ich häng das hier mal an und hoffe, dass es das Forum nicht zu voll müllt:

                      Code:
                      BCC-Liste erstellt - Memory: 109840
                      Bildnamen ins Array geschrieben - Memory: 111684
                      Backup vom _watchFolder - Memory: 112120
                      $allArray erzeugt - Memory: 115168
                      Verzeichnisse erstellt - Memory: 115168
                      Seitenverhaeltnisse - Memory: 116216
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 1751280_709.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2051700_309.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2370702_253.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2651600_381.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2651700_709.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2651701_309.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2670700_302.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2719201_253.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2719201_302.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2719201_309.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2719201_700.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2719201_709.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 10179244
                      Bild erzeugt: 2719201_710.jpg - Memory: 10179296
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 1751280.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2051700.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2370702.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2651600.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2651700.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2651701.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2670700.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2719201.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2719201.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2719201.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2719201.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116444
                      ImageCopyResampled - Memory: 6969644
                      Bild erzeugt: 2719201.jpg - Memory: 6969692
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 6969736
                      Bild erzeugt: 2719201.jpg - Memory: 6969784
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 1751280.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2051700.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2370702.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2651600.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2651700.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2651701.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2670700.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201.jpg - Memory: 5849496
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 1751280.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2051700.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2370702.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2651600.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2651700.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2651701.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2670700.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201.jpg - Memory: 5262512
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 1751280_709.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2051700_309.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2370702_253.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2651600_381.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2651700_709.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2651701_309.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2670700_302.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201_253.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201_302.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201_309.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201_700.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201_709.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5849448
                      Bild erzeugt: 2719201_710.gif - Memory: 5849500
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 1751280_709.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2051700_309.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2370702_253.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2651600_381.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2651700_709.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2651701_309.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2670700_302.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201_253.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201_302.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201_309.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201_700.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201_709.gif - Memory: 5262516
                      Seitenverhaeltnisse - Memory: 116528
                      ImageCopyResampled - Memory: 5262464
                      Bild erzeugt: 2719201_710.gif - Memory: 5262516

                      Kommentar


                      • #12
                        da hiermit a) die Pixeldichte auf Monitoren und damit b) die Erscheinungsgröße von Grafiken beeinflusst wird.
                        Jein. Kein typischer Screendesigner wird nach Lineal planen (Grafik soll später 5cm groß sein), sondern ob der Fülle an Bildschirmauflösungen einfach auf Pixelmaß arbeiten.
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Hab ich auch nicht behauptet. Nur kann ein Bild eben trotzdem eine physische Größe haben. Letztere wird selbstverständlich nur beim Druck oder entsprechender Pixelgröße korrekt dargestellt, da sonst halbe Pixel simuliert werden müssten (1px muss dazu einem Pt entsprechen, was bei 72dpi-Monitoren gegeben ist).
                          Aufgrund der verschiedenen Monitorauflösungen und Größen ist ein maßgenaues Arbeiten auch gar nicht mehr möglich. Das ging nur damals zu CRT-Zeiten mit genormter Pixeldichte.
                          Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                          Kommentar


                          • #14
                            Wie gesagt, ich stapfe hier etwas im Dunklen.
                            Memoryleaks sind auch keine zu erkennen (zumindest keine großen, es gehen schon ein paar Byte verloren, aber das kann auch mit Speicherfragmentierung zusammenhängen). 10MB sind zwar schon ne Hausnummer, aber da ist ja noch eine Menge Luft nach oben.

                            Ansonsten läuft auf dem Server nichts anderes, was zwischenzeitlich den 32MB RAM Pool belegen könnte? Der Cronjob kaskadiert auch nicht oder wird mehrfach aufgerufen?

                            Momentan ist der 500er Serverfehler noch ein Ansatz, den du verfolgen solltest. Da könnte tatsächlich der Knackpunkt liegen. Sollte sich das Problem hartnäckig halten, würde ich an deiner Stelle auch mal andere Hoster antesten. Tritt das Problem dort auch auf, liegt das Problem warscheinlich im Code, anderenfalls könnte es einfach am Server liegen (alte Hard- oder Software, schlechte Konfiguration, Überlastung des Systems o.ä.). PHP Versionen vergleichen, Bugdatabase nach bekannten Problemen durchsuchen... naja, da kann man sich ranhalten, wenn man noch auf der Suche nach Gründen ist

                            Wie das am Ende aussah, kann ich dir nicht mehr genau sagen, weil ich den Code rausgeschmissen habe, aber die Grundidee war, dass ich in den beiden For-Schleifen ein "header("Location: http://www.Link.zum/Script");" mache und die Zählvbariablen in einer Sessionvariable ablege, damit ich diese nach dem Aufruf wieder verwenden kann. Ich hab dann irgendwann versucht alle Variablen als Session-Variablen zu nutzen und da bekam ich bei Aufruf des Scripts nur noch 'ne weiße Seite. Da mir nicht wirklich klar war, ob dieser Ansatz überhaupt Sinn macht, habe ich das alles rückgängig gemacht und versucht mich auf das Problem zu konzentrieren, dass ich vielleicht einfach nicht gut programmiert habe und das alles vielleicht doch bei weitem zu Umständlich ist, daher habe ich mich dann hier registriert, um herauszufinden, ob ich total auf dem Holzweg bin, oder das schon in die richtige Richtung geht.
                            Die Grundidee war schon nicht so verkehrt, allerdings kann man in der CLI Version keine Cookies benutzen (vermutlich der Grund, weswegen dein Sessionhandling nicht funktioniert hat).

                            Du brauchst Sessions aber nicht unbedingt, es gibt andere Wege, z.B. könnte das Script pro Aufruf immer nur 25 (mehr/weniger) Dateien verarbeiten und sich dann beenden. Die bearbeiteten Dateien müssen aber verschoben werden, damit sie beim nächsten Durchlauf nicht wieder verarbeitet werden.
                            Wenn du nicht verschieben willst, arbeite mit einer gesonderten Blacklist, eine neue Datei in die du die Namen der bereits bearbeiteten Dateien abspeicherst. Bei dieser Variante sollte regelmässig aufgeräumt werden, d.h. Dateien aus dem watch-Folder löschen, und wenn das passiert, nicht vergessen, den Namen auch von der Blacklist zu entfernen.
                            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                            Kommentar


                            • #15
                              Zitat von lstegelitz Beitrag anzeigen
                              ...
                              Du brauchst Sessions aber nicht unbedingt, es gibt andere Wege, z.B. könnte das Script pro Aufruf immer nur 25 (mehr/weniger) Dateien verarbeiten und sich dann beenden. Die bearbeiteten Dateien müssen aber verschoben werden, damit sie beim nächsten Durchlauf nicht wieder verarbeitet werden.
                              Wenn du nicht verschieben willst, arbeite mit einer gesonderten Blacklist, eine neue Datei in die du die Namen der bereits bearbeiteten Dateien abspeicherst. Bei dieser Variante sollte regelmässig aufgeräumt werden, d.h. Dateien aus dem watch-Folder löschen, und wenn das passiert, nicht vergessen, den Namen auch von der Blacklist zu entfernen.
                              Dann habe ich doch aber das Problem, dass erst 25 Bilder abgearbeitet werden und anschließend aus dem watchfolder entfernt werden. Somit sind die Bilder doch beim nächsten Durchlauf, für den nächsten Ordner in dem die Bilder in anderer Größe benötigt werden gar nicht mehr im Original vorhanden.
                              Die Bilder werden ja nicht nur nur ein Mal verkleinert und verschoben, sondern gleich 6 Mal: In 6 verschiedene Ordner in 6 verschiedenen Größen und verschiedenen Formaten.

                              Ich glaube ich verstehe einfach nicht, wie ich das Script erneut aufrufen muss, damit ich an einer bestimmten Stelle weitermachen kann, ohne dass die benötigten Variablen weg sind.

                              Vielleicht sollte ich statt der For-Schleife, die mein $i und $j immer auf 0 setzt einfach eine While-Schleife nehmen und $i und $j auf den Letzten Stand setzen, aber dann muss ich auch sicher gehen können, dass die beiden Arrays, die zu Beginn des Scripts erstellt werden, immer auf die gleiche Art und in gleicher Reihenfolge erstellt werden.

                              Sehr verwirrend alles, ich versuch mal das umzusetzen und bedanke mich erneut für Hinweise und Tips.
                              Gruß
                              Flo

                              Kommentar

                              Lädt...
                              X