Willi: Viele Bilder mit PHP verkleinern - beste Lösung?

Hallo,

Ich bin gerade an der Programmierung eines Fotoalbums-Scripts mittels PHP und MySQL.
Um möglichst viele Bilder gleichzeitig in das Galerie zu bekommen (und nicht jedes einzeln hochzuladen), möchte ich mittels FTP die Bilder in ein bestimmtes Verzeichnis hochladen, und dann mit PHP verkleinern und in die Datenbank speichern.
Allerdings habe ich mit der derzeitigen Lösung (Verzeichnis laden, jede Datei durchgehen, Infos in die DB schreiben und in die verschiedenen Größen vekleinern) ein Problem: es können nur 6,5 Dateien durchgegangen werden - danach ist die "Maximal Execution Time" abgelaufen und das Script endet mit einem Fehler - und es gibt eine Datei, die nicht in vollständig bearbeitet wurde. Außerdem fehlen ja noch viele andere Dateien (mit dem Verschieben in andere Verezeichnisse etc. klappt das irgendwie, ist aber seehr unschön).

Wie würdet ihr eine größere Menge an Bildern (~ 250 Stück) in eine Fotogalerie bringen?

Grüße,
Willi

  1. Hallo!

    ein Problem: es können nur 6,5 Dateien durchgegangen werden - danach ist die "Maximal Execution Time" abgelaufen und das Script endet mit einem Fehler

    Dann bearbeite pro Durchgang nur genau eine Datei.
    Das Script nimmt die erste Datei im verzeichnis und bearbeitet sie. Zum Schluß löscht/verschiebt sie diese.
    Dann ruft sich das Script einfach solange selber auf bis keine Dateien mehr vorhanden sein.
    Der User muss einfach geduldig warten bis alle Bilder durch sind.

    Den Selbstaufruf des Scripts könntest du mit body onload="document.location.reload()" durchführen.

    mfg
      frafu

    1. Hallo FraFu,

      Dann bearbeite pro Durchgang nur genau eine Datei.
      Das Script nimmt die erste Datei im verzeichnis und bearbeitet sie. Zum Schluß löscht/verschiebt sie diese.
      Dann ruft sich das Script einfach solange selber auf bis keine Dateien mehr vorhanden sein.
      Der User muss einfach geduldig warten bis alle Bilder durch sind.

      Ah, stimmt. Vielen Dank für den Denkanstoß!
      So mache ich es jetzt auch, und es funktioniert einwandfrei :-)

      Im Folgenden seht ihr noch mein derzeitiges Script zum Einlesen der Bilder, ihr könnt ja mal drüber gehen und Verbesserungsvorschläge posten.

        
      <?php  
        $maxsize = 4; // Maximale Größe der Datei in MB  
        $max_thumb_width = 110;  
        $max_mini_width = 30;  
        $max_mid_width = 500;  
        $uploaddir_short = 'fotos/uploads/'.$_GET['dir'].'/';  
        $movedir_short = 'fotos/'.$_GET['dir'].'/';  
        $uploaddir = ereg_replace("/[a-z, A-Z, 0-9]*.php$", "", $_SERVER['SCRIPT_FILENAME']).'/'.$uploaddir_short; // Ich weiß, das ist sehr unschön... habt ihr bessere Ideen?  
        $movedir = ereg_replace("/[a-z, A-Z, 0-9]*.php$", "", $_SERVER['SCRIPT_FILENAME']).'/'.$movedir_short; // siehe oben  
        
        if(!isset($_GET['dir'])){  
          $directories = scandir($uploaddir_short);  
          foreach($directories AS $directory){  
            if($directory != '.' && $directory != '..')  
              echo '<li><a href="getphotos.php?dir='.$directory.'">'.$directory.'</a></li>';  
          }  
        } else {  
          if(is_string($_GET['dir']) && $_SESSION['rights'] == 'a'){  
            if($files = scandir($uploaddir_short)){  
              foreach($files AS $filename){  
             if(!is_dir($movedir)){  
               mkdir($movedir);  
             }  
             $ext = strstr($filename, ".");  
             if($ext == '.jpg' || $ext == '.JPG' || $ext == '.jpeg'){  
               // Main-Part  
                  $exif = exif_read_data($uploaddir.$filename, 0, true);  
                  if($exif){  
                     $camera = $exif['IFD0']['Make'] . ' ' . $exif['IFD0']['Model'];  
                     $shottime = strtotime($exif['EXIF']['DateTimeOriginal']);  
                  }  
           mysql_query("INSERT INTO pic2(picname, uploadtime, catname, shottime, camera)  
           VALUES('".$filename."', ".time().", '".$_GET['dir']."', '".$shottime."', '".$camera."')") OR die(mysql_error());  
                  $id = mysql_insert_id();  
                  $filename_old = $filename;  
                  $filename = $_GET['dir'].'_'.$id.'.jpg';  
        
                  rename($uploaddir.$filename_old, $uploaddir.$filename); // Benennt die alten IMG_xxx/DESC_xxx-Dateien in name_id.jpg um  
        
                  $org_pic = imagecreatefromjpeg($uploaddir.$filename);  
                  $org_width = imagesx($org_pic);  
                  $org_height = imagesy($org_pic);  
        
                  $mid_width = $max_mid_width;  
                  $mid_height = ($mid_width/$org_width)*$org_height;  
                  $mid = ImageCreateTrueColor($mid_width, $mid_height);  
                  if($org_width > $max_mid_width){  
                    ImageCopyresampled($mid, $org_pic, 0, 0, 0, 0, $mid_width, $mid_height, $org_width, $org_height);  
                    if($mid_height > $mid_width || $mid_width > $mid_width){  
                      ImageCopy($mid,$mid,0,0,0,0,$mid_width,$mid_width);  
                    }  
                  } else {  
                    $mid = $org_pic;  
                  }  
                  ImageJPEG($mid, $movedir."mid_".$filename);  
        
                  $thumb_width = $max_thumb_width;  
                  $thumb_height = ($thumb_width/$org_width)*$org_height;  
                  $thumb = ImageCreateTrueColor($thumb_width, $thumb_height);  
                  ImageCopyresampled($thumb, $org_pic, 0, 0, 0, 0, $thumb_width, $thumb_height, $org_width, $org_height);  
                  if($thumb_height > 100 || $thumb_width > 100){  
                    ImageCopy($thumb,$thumb,0,0,0,0,100,100);  
                  }  
                  ImageJPEG($thumb, $movedir."thumb_".$filename);  
        
                  $mini_width = $max_mini_width;  
                  $mini_height = ($mini_width/$org_width)*$org_height;  
                  $mini = ImageCreateTrueColor($mini_width, $mini_height);  
                  ImageCopyresampled($mini, $org_pic, 0, 0, 0, 0, $mini_width, $mini_height, $org_width, $org_height);  
                  if($mini_height > $mini_width || $mini_width > $mini_width){  
                    ImageCopy($mini,$mini,0,0,0,0,$mini_width,$mini_width);  
                  }  
                  ImageJPEG($mini, $movedir."mini_".$filename);  
        
                  imagedestroy($org_pic);  
        
                  rename($uploaddir.$filename, $movedir.$filename);  
        
                  echo '<img src="'.$movedir_short."thumb_".$filename.'" alt="" /> erfolgreich erzeugt!<br />';  
                  echo 'Kamera: '.$camera.' - Geschossen: '.$shottime.' ('.date("j.n.Y, H:i",1184319884).')<br />';  
                 break;  
             } else {  
                  echo 'Die Datei ist keine .jpg-Datei! - '.$filename.'<br />';  
             }  
              }  
            } else {  
              echo 'Dieses Verzeichnis existiert nicht!';  
            }  
          }  
        }  
      ?>  
      
      

      Grüße,
      Willi