Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Bildverarbeitung vieler Dateien optimieren (Seite lädt nicht zuende)

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Bildverarbeitung vieler Dateien optimieren (Seite lädt nicht zuende)

    Hi Leute,

    ich bin gerade dabei eine Upload-Funktion für Fotos in einer Homepage einzubinden.
    Den eigentlichen Upload habe ich mit inaflashuploader realisiert - funktioniert super, kann ich jedem empfehlen!

    Die Bilder werden also in einem Ordner auf dem Server abgelegt.
    Mit PHP möchte ich nun von allen Bildern in diesem Ordner ein Thumbnail erstellen, sowie das Bild verkleinert speichern, wenn nötig (breiter als 900)

    Das funktioniert auch alles.
    Etwas problematisch wird die Sache ab 20-30 Bildern. Viele Browser warten ja nicht beliebig lang auf die Seite, sondern hören irgendwann auf zu laden. So bricht der Vorgang dann leider mittendrin ab:
    1.jpg

    Wenn nur die Ausgabe der Seite abbräche - ok. Aber leider bleiben auch die bis dahin nicht bearbeiteten Bilder zurück.

    Hier noch der Code:
    PHP-Code:
    if (is_dir($dir)) {
        if (
    $dh opendir($dir)) {
            while ((
    $file readdir($dh)) !== false) {
                if ((
    $file != '.') && ($file != '..')) {
                    if (
    is_file($dir.$file)) {
                        
    $bildid++;
                        
    $i++;
                        
    $rang++;

                        
    // Bildgrößen festlegen
                        
    $thumbbreite 130;
                        
    $bildbreite 900;
                        
                        
    // Bilddaten feststellen 
                        
    $size getimagesize("$dir"."$file"); 
                        
    $breite $size[0];
                        
    $hoehe $size[1];
                        
                        
    $thumbhoehe intval($hoehe*$thumbbreite/$breite);
                        
                        if (
    $breite $bildbreite) {
                            
    $bildhoehe intval($hoehe*$bildbreite/$breite);
                        } else {
                            
    $bildhoehe $hoehe;
                            
    $bildbreite $breite;
                        }
                        
                        
    // Thumbnail erstellen                                    
                        
    $thumbnail $ausgabe.$bildid."_tn.jpg";    
                        
                        
    $altesBild=ImageCreateFromJPEG("$dir"."$file"); 
                        
    $neuesBild=imagecreatetruecolor($thumbbreite,$thumbhoehe); 
                        
    ImageCopyResampled($neuesBild,$altesBild,0,0,0,0,$thumbbreite,$thumbhoehe,$breite,$hoehe); 
                        if (
    ImageJPEG($neuesBild,$thumbnail)) {
                            
    $success_thumb true;
                        }

                        
                        
    // Bild erstellen                                     
                        
    $bild $ausgabe.$bildid.".jpg";                                    

                        
    $altesBild=ImageCreateFromJPEG("$dir"."$file"); 
                        
    $neuesBild=imagecreatetruecolor($bildbreite,$bildhoehe); 
                        
    ImageCopyResampled($neuesBild,$altesBild,0,0,0,0,$bildbreite,$bildhoehe,$breite,$hoehe); 
                        if (
    ImageJPEG($neuesBild,$bild)) {
                            
    $success_bild true;
                        }
                        echo(
    '['.$i.' von '.$gesamtanzahl.'] Die Datei <strong>'.$file.'</strong> wurde ');
                        
    unlink($dir.$file);
                        
                        if (
    $success_bild) {
                            if (
    $success_thumb) {
                                
    $abfrage "INSERT INTO bilder (bildid, siteid, beschreibung, datum, rang, thumb_width, thumb_height) VALUES ('$bildid', '$id', '$sbeschreibung', '$datum', '$rang', '$thumbbreite', '$thumbhoehe')";
                                if (
    mysql_query($abfrage)) {
                                    echo (
    'verarbeitet und in der Datenbank gespeichert.<br />');
                                } else {
                                    echo (
    'verarbeitet, jedoch trat beim Speichern in der Datenbank ein Fehler auf:<br /><strong>'.mysql_error().'</strong><br />');
                                    
    $fehler true;
                                }
                            }
                        } else {
                            echo (
    'nicht verarbeitet und gespeichert - versuche es Bitte nochmal.');
                            
    $fehler true;
                        }
                    }
                }
            }
            
        } 
    closedir($dh);

    Das Memorylimit, sowie die Ausführungszeit fürs Skript habe ich ausreichend per php.ini erhört, das sollte kein Problem sein - sonst käme ja auch eine Fehlermeldung.

    Hat jemand eine Idee, wie ich das Skript verbessern kann? Oder bleibt mir nur die Alternative auf AJAX umzustellen? Oder gibt es noch eine andere, einfachere Möglichkeit?

    Schonmal vielen Dank für jede Hilfe und viele Grüße,
    Nico


  • #2
    Warum erzeugst du das Thumbnail nicht direkt nach dem Upload des Bildes?
    http://hallophp.de

    Kommentar


    • #3
      Mit dem Flashuploader kann man beliebig viele Dateien hochladen, diese werden dann einfach auf dem Server abgelegt. Ich gehe dann mit PHP durch das Verzeichnis und berechne die Bilder neu.

      Ich glaube das Problem ist, dass nicht nur Thumbnails generiert werden, sondern auch Bilder mit ner Breite von 900px. Das mache ich, damit die Bilder hinterher auf der Homepage per Lightbox ordentlich dargestellt werden können.

      Diesen Schritt kann ich natürlich auch weglassen, nur müssten die Bilder dann vom Browser gestaucht werden (handelt sich in der Regel um Fotos, welche ja recht groß sind). Allerdings hab ich dann
      a) Mehr zu laden an dem Bild
      b) Die nicht so schöne Skalierung des jeweiligen Browsers.

      Aber wahrscheinlich wird es darauf hinaus laufen, alles andere scheint zu aufwändig zu sein.
      Hatte schon über nen Cronjob nachgedacht, allerdings kann der Nutzer die Bilder ja dann erst später auf der Seite sehen.

      Kommentar


      • #4
        Verarbeite X Bilder (10 vllt?) und lade danach die Seite neu per JS, Meta oder Link.
        So kannst du das ganze in Steps unterteilen.

        Kommentar


        • #5
          lol, die Idee kam mir vorhin auch =) Danke =)
          Werde es wohl so lösen, dann brauch' ich die Bildkonvertierung nicht weiter ändern.

          Ich lass das Thema mal noch offen, vielleicht hat jemand ja eine noch bessere Idee?! =)
          Ansonsten schließe ich es in den nächsten Tagen.

          Vielen Dank für eure Hilfe,
          Nico

          Kommentar


          • #6
            Eine Alternative wäre - die kleinen Versionen erst dann zu erzeugen, wenn sie gebraucht werden.

            Kommentar


            • #7
              Auch eine gute Idee, habe es gerade mal getestet.

              Leider beschleunigt das das Skript kaum. Denke das Problem liegt tatsächlich bei den "großen" Bildern :\

              Kommentar


              • #8
                Zitat von Hankman Beitrag anzeigen
                Auch eine gute Idee, habe es gerade mal getestet.
                Wie ...?

                Leider beschleunigt das das Skript kaum.
                Ich bin mir nicht sicher, ob du wirklich verstanden hast, was ich meinte ...

                Kommentar


                • #9
                  @ChrisB:
                  Jain - hatte verstanden, dass du nur die Thumbnails meinst, und den entsprechenden Teil aus dem Skript entfernt.
                  Aber ich denke du meinst, dass die Bilder erst bei Bedarf generiert werden. Das ist auch eine gute Idee, weil das Erstellen von nur einem Bild geht ja recht fix, da merkt der User ja nicht viel von.

                  Baue es im Moment so um, dass immer nur "häppchenweise" 10 Bilder verarbeitet werden, mal schauen wie und ob das funktioniert.

                  Kommentar


                  • #10
                    Falls es irgendwann mal jemandem weiterhilft:

                    Habe es jetzt ganz einfach per JS und nem iFrame gelöst (Kompatibilität spielt keine Rolle, da es nur einen "admin" geben wird).
                    Auf der Seite, die die Bilder speichert ist also ein iFrame, in dem das obige Skript zum größten Teil abläuft. Diese Seite im Frame lädt sich nach 7 Bildern automatisch neu, gibt dabei immer die verbleibende Anzahl Bilder aus. Wenn alles fertig ist, wird eine Erfolgsmeldung angezeigt.

                    Leider hat auch diese Lösung ihre Tücken.. zumindest bei Strato, wo die Seite (leider) gehostet ist - liegt nicht in meiner macht das zu ändern So kommt ab und an ein "internal Server error"... aber wann genau und woran das liegt hab ich noch nicht ergründen können.

                    Vielen Dank für Eure Ideen und schönen Sonntag,
                    Nico

                    Kommentar

                    Lädt...
                    X