Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

GalleryScript - Performance Optimierung

Diskussion: GalleryScript - Performance Optimierung im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hey Leute, habe eben mal meine alten Script ausgekramt und mein altes Gallery Script gefunden. Jedoch ist mir aufgefallen, ...

Antwort
Alt 21.07.08, 20:38   #1 (permalink)
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard GalleryScript - Performance Optimierung

Anzeige

Hey Leute,
habe eben mal meine alten Script ausgekramt und mein altes Gallery Script gefunden.
Jedoch ist mir aufgefallen, dass dies alles andere als performant ist.

Als Beispiel:
Ich habe knapp 260 Fotos von der Loveparade in den Ordner hinein geknallt und mein 2gHz Dual Core bekommt 100% CPU-Auslastung.

Mein Anliegen nun: Wir bekomme ich das Skript performant... ich hab keine Ahnung ich hab zwar überlegt mit Caching der einzelnen Thumbs.. . aber hm.. gewusst wie?!

Hier einmal die picz.php die ich über die Navi include:

PHP-Code:
<table width="100%" border=0>
    <tr>
           <td id="ueberschiftcontent" colspan="6">Bilder (Seite <?php echo $_GET['seite']+1?>)</td>
    </tr>
</table>
<?php
$pfad 
"images\gallery";
$spalten 3;
$zeilen 3;

$handle opendir($pfad);

for(
$max 0$bild readdir($handle); $max++);
$max+=100;
echo 
"<div align=\"center\">";
echo 
"<table cellspacing=\"10\" cellpadding=\"5\">";
for(
$n 0$n<$zeilen$n++){
    echo 
"<tr>";
    for(
$i 0$i<$spalten&&($n*$spalten+$i+$_GET['seite']*$spalten*$zeilen)<$max$i++)
        echo 
"<td id=\"pic\"><a href=\"inc/create_pic.php?id=".($n*$spalten+$i+$_GET['seite']*$spalten*$zeilen)."\"><img src=\"inc/create_pic.php?id=".($n*$spalten+$i+$_GET['seite']*$spalten*$zeilen)."&thumb\" border=\"0\" /></a></td>";
    echo  
"</tr>";
}
echo
"</table>";

$getvars '?'; foreach($_GET as $key => $value) if($key!="seite"$getvars.=$key.'='.$value.'&';

echo 
"<table cellspacing=\"10\" cellpadding=\"5\">";
echo 
"<tr colspan=\"2\">";
if(
$spalten*$zeilen<$max){
    echo 
"<td colspan=\"".($spalten-2)."\">";
    if(
$_GET['seite']>0) echo "<a href=\"".$_SERVER['PHP_SELF'].$getvars."seite=".($_GET['seite']-1)."\">&laquo; Vorherige Seite</a>&nbsp;";
    echo 
"</td><td>";
    if((
$_GET['seite']+1)*$spalten*$zeilen<$max) echo "<a href=\"".$_SERVER['PHP_SELF'].$getvars."seite=".($_GET['seite']+1)."\">Nächste Seite &raquo;</a>";
    echo 
"</td>";
}
echo 
"</tr></table></div>";

?>
Und hier einmal die create_pic.php:

PHP-Code:
<?php

$pfad 
"../images/gallery/Blabla";
$breite_neu 100;

$handle opendir($pfad);

for(
$i 0$i <= $_GET['id']+&& $bild readdir($handle); $i++);
@list(
$breite$hoehe$format) = getimagesize($pfad.'/'.$bild) or die("ID ung&uuml;tig");
    

if(!isset(
$_GET['thumb'])){
    
header("Location: ".$pfad.'/'.$bild);
    exit;
}

switch(
$format){
    case 
1:
      
$quellbild imagecreatefromgif($pfad.'/'.$bild);
      break;
    case 
2:
      
$quellbild imagecreatefromjpeg($pfad.'/'.$bild);
      break;
    case 
3:
      
$quellbild imagecreatefrompng($pfad.'/'.$bild);
}

$skalierungsfaktor $breite/$breite_neu;
$hoehe_neu $hoehe/$skalierungsfaktor;
$zielbild imagecreatetruecolor($breite_neu,$hoehe_neu);
imagecopyresampled($zielbild,$quellbild,0,0,0,0,$breite_neu,$hoehe_neu,$breite,$hoehe);
header("Content-type: image/jpeg");
imagejpeg($zielbild''100);
imagedestroy($zielbild); imagedestroy($quellbild);
closedir($handle);

?>
Wäre nett wenn mir einige Helfen könnten.
Nicht wundern, das Script is mit Hilfen aus diesem Forum entstanden :)
reaLInsanity ist offline   Mit Zitat antworten
Alt 22.07.08, 00:09   #2 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Arrow

Naja, prinzipiell kannst du auf zwei Wegen das ganze etwas beschleunigen: 1. Die erstellten Thumbnails cachen und 2. den Browsercache des Benutzers unterstützen - wobei ersteres den markantesten Vorteil bringt. Du kannst dir ja mal mein Easy Gallery Skript anschauen, da habe ich beide Varianten implementiert.
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 22.07.08, 10:10   #3 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

also ich hab das bei meinem Bildergalerie-Script damals so gemacht:

Normales Bild: [Name].jpg
generiertes Thumbnail: [Name].jpeg
Kommentartext: [Name].txt

bei meiner neuen Version, die ich basteln will, wird alles über MySQL laufen, um die Reihenfolge der Bilder besser beeinflussen zu können - dann wird es bei mir wohl einen Ordner "cache" geben, die Dateinamen werden aus md5(filename+timestamp) oder ähnlich generiert und in der Datenbank wird's dann eine Tabelle "pictures" mit den Feldern "id", "image", "thumb", "comment" geben, eine Tabelle "gallery" mit "id","title","description","parent_id" und Tabelle "gal_pic" mit "id","gal_id","pic_id" ... (und "user_comment" mit "id","pic_id","user","comment")
beavisbee ist offline   Mit Zitat antworten
Alt 22.07.08, 11:08   #4 (permalink)
Themenstarter
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard

Zitat:
Original von LX
Naja, prinzipiell kannst du auf zwei Wegen das ganze etwas beschleunigen: 1. Die erstellten Thumbnails cachen und 2. den Browsercache des Benutzers unterstützen - wobei ersteres den markantesten Vorteil bringt. Du kannst dir ja mal mein Easy Gallery Skript anschauen, da habe ich beide Varianten implementiert.
Könntest du mir vllt Hilfestellung geben, das einzu bauen?
Ich hab es zwar bei mir mal versucht und der THUMB-Ordner wird auch erstellt. Jedoch speichert er dort keine Thumbs hinein.
Wäre lieb wenn du mir da helfen könntest. Oder zumindest nen bisschen unter die Arme greifst.
reaLInsanity ist offline   Mit Zitat antworten
Alt 22.07.08, 11:47   #5 (permalink)
 
Benutzerbild von metax.
 
Registriert seit: 22.01.07
metax. Leistung: 8086
metax. eine Nachricht über ICQ schicken
Likes: 10
Standard

Du musst darauf achten, dass der Webserver-Benutzer auch in das Thumbnail-Verzeichnis schreiben kann (chmod ...).

Ansonsten würde ich folgendes Vorgehen im Thumbnail-Script empfehlen:

1. Bilde einen Hash aus Bildname und letzter Zugriffszeit (z.B: mit md5). Bei Bedarf auch noch Höhe und Breite des Thumbnails (falls das variiert)

2. Schau nach, ob der betreffende Thumbnail mit dem Hash schon existiert. Wenn ja, mache einen HTTP-Redirect (mit dem Location-Header) auf das Thumbnail. Beende jetzt das Script

3. Falls nein, erstelle das Thumbnail wie gewohnt. Anstatt es mit imagejpeg($zielbild, '', 100); auszugeben, speichere es in die Datei:
PHP-Code:
<?php imagejpeg($zielbild'thumbnaildir/' $hash '.jpg'100); ?>
4. Wiederhole Schritt 2 und mache damit einen Redirect auf das neu erstellte Thumbnail

mfg, metax.
__________________
Wenn keiner zuschaut, teile ich heimlich durch Null!
Meine Homepage: Planet Metax | meine Bilder: DeviantArt | Twitter
metax. ist offline   Mit Zitat antworten
Alt 22.07.08, 12:50   #6 (permalink)
Themenstarter
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard

Klappt jetzt alles wunderbar...
Jedoch, wenn ich die Galerie öffne, erstellt er immer nur von 2 Dateien den Thumb... und bindet auch nur 2-3 Thumbs ein. Das ist echt ziemlich komisch und ich finde keinen Fehler.

Ich schätze mal das sollte an der Datei liegen:
PHP-Code:
<table width="100%" border=0>
    <tr>
           <td id="ueberschiftcontent" colspan="6">Bilder (Seite <?php echo $_GET['seite']+1?>)</td>
    </tr>
</table>
<?php
$pfad 
"images/gallery/Blabla/thumb";
$spalten 4;
$zeilen 5;

$handle opendir($pfad);
for(
$max 0$bild readdir($handle); $max++);
echo 
"<div align=\"center\">";
echo 
"<table cellspacing=\"10\" cellpadding=\"5\">";
for(
$n 0$n<$zeilen$n++){
    echo 
"<tr>";
    for(
$i 0$i<$spalten&&($n*$spalten+$i+$_GET['seite']*$spalten*$zeilen)<$max$i++)
        echo 
"<td id=\"pic\"><a href=\"inc/create_pic.php?id=".($n*$spalten+$i+$_GET['seite']*$spalten*$zeilen)."\"><img src=\"inc/create_pic.php?id=".($n*$spalten+$i+$_GET['seite']*$spalten*$zeilen)."&thumb\" border=\"0\" /></a></td>";
    echo  
"</tr>";
}
echo
"</table>";

$getvars '?'; foreach($_GET as $key => $value) if($key!="seite"$getvars.=$key.'='.$value.'&';

echo 
"<table cellspacing=\"10\" cellpadding=\"5\">";
echo 
"<tr colspan=\"2\">";
if(
$spalten*$zeilen<$max){
$max+=200;
    echo 
"<td colspan=\"".($spalten-2)."\">";
    if(
$_GET['seite']>0) { echo "<a href=\"".$_SERVER['PHP_SELF'].$getvars."seite=".($_GET['seite']-1)."\">&laquo; Vorherige Seite</a>&nbsp;"; }
    echo 
"</td><td>";
    if((
$_GET['seite']+1)*$spalten*$zeilen<$max) { echo "<a href=\"".$_SERVER['PHP_SELF'].$getvars."seite=".($_GET['seite']+1)."\">Nächste Seite &raquo;</a>"; }
    echo 
"</td>";
}
echo 
"</tr></table></div>";

?>
Nur ich find einfach nichts...
Das Beispiel zum ansehen findet ihr [hier]
reaLInsanity ist offline   Mit Zitat antworten
Alt 22.07.08, 16:38   #7 (permalink)
 
Benutzerbild von metax.
 
Registriert seit: 22.01.07
metax. Leistung: 8086
metax. eine Nachricht über ICQ schicken
Likes: 10
Standard

Hm, interessanter wäre die aktuelle inc/create_pic.php ...
__________________
Wenn keiner zuschaut, teile ich heimlich durch Null!
Meine Homepage: Planet Metax | meine Bilder: DeviantArt | Twitter
metax. ist offline   Mit Zitat antworten
Alt 22.07.08, 17:51   #8 (permalink)
Themenstarter
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard

create_pic.php:

PHP-Code:
<?php

$pfad         
"../images/gallery/Blabla";
$breite_neu 100;
$thumbdir     $pfad."/thumb"

if ( !
is_dir $thumbdir ) ) @mkdir $thumbdir );

/*if ( !is_readable ( $thumbdir ) || filemtime ( $thumbdir ) < filemtime ( $filename ) )
{*/
    
$handle opendir($pfad);
    
    for(
$i 0$i <= $_GET['id']+&& $bild readdir($handle); $i++);
    @list(
$breite$hoehe$format) = getimagesize($pfad.'/'.$bild) or die("ID ung&uuml;tig");
        
    
$hash md5($bild+breite+filemtime($pfad.'/'.$bild));
    
    if(
file_exists($thumbdir."/".$hash.".jpg")) 
    { 
        
header("Content-type: image/jpg"); 
        
$im imagecreatefromjpeg($thumbdir."/".$hash.".jpg");
        
imagepng($im);
    }
    else
    {
        if(!isset(
$_GET['thumb'])){
            
header("Location: ".$pfad.'/'.$bild);
            exit;
        }
        
        switch(
$format){
            case 
1:
              
$quellbild imagecreatefromgif($pfad.'/'.$bild);
              break;
            case 
2:
              
$quellbild imagecreatefromjpeg($pfad.'/'.$bild);
              break;
            case 
3:
              
$quellbild imagecreatefrompng($pfad.'/'.$bild);
        }
        
        
$skalierungsfaktor $breite/$breite_neu;
        
        if ( 
$breite $hoehe )    { $hoehe $breite/1.3;    }
        
$hoehe_neu $hoehe/$skalierungsfaktor;
        
        
$zielbild imagecreatetruecolor($breite_neu,$hoehe_neu);
        
imagecopyresampled($zielbild,$quellbild,0,0,0,0,$breite_neu,$hoehe_neu,$breite,$hoehe);
        
header("Content-type: image/jpg"); 
        
imagejpeg($zielbild$thumbdir."/".$hash.".jpg",100);
         
        
imagedestroy($zielbild); 
        
imagedestroy($quellbild);
        
closedir($handle);
    }
/*}*/
?>
reaLInsanity ist offline   Mit Zitat antworten
Alt 22.07.08, 18:00   #9 (permalink)
 
Benutzerbild von metax.
 
Registriert seit: 22.01.07
metax. Leistung: 8086
metax. eine Nachricht über ICQ schicken
Likes: 10
Standard

Also erstens würde es reichen, wenn du mit file_exists() prüfst, ob das Thumbnail existiert.
Das Verzeichnis-Handle wird dann überflüssig.

Zweitens ist es nicht nötig, die ganzen Bilddaten mit imagepng() durchzureichen, Es ist viel Speichersparender, wenn du einfach nur einen Redirect mittels "header('Location: ...');" machst.
__________________
Wenn keiner zuschaut, teile ich heimlich durch Null!
Meine Homepage: Planet Metax | meine Bilder: DeviantArt | Twitter
metax. ist offline   Mit Zitat antworten
Alt 22.07.08, 18:07   #10 (permalink)
Themenstarter
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard

Also ich hab das schonmal angepasst, das mit dem Header:
PHP-Code:
if(file_exists($thumbdir."/".$hash.".jpg")) 
    { 
        
header('Location: '.$thumbdir.'/'.$hash.'.jpg');
    } 
Aber er lädt nach wie vor nur die Thumbs von vereinzelten Bildern... nicht von allen ?(
Wie man das schön bei Seite 2 sehen kann.

Edit:
Hab den Fehler gefunden, hab die create_pic etwas von der überprüfungen her anpassen müssen:

PHP-Code:
<?php

$pfad         
"../images/gallery/Blabla";
$breite_neu 100;
$thumbdir     $pfad."/thumb"

if ( !
is_dir $thumbdir ) ) @mkdir $thumbdir );

/*if ( !is_readable ( $thumbdir ) || filemtime ( $thumbdir ) < filemtime ( $filename ) )
{*/
    
$handle opendir($pfad);
    
    for(
$i 0$i <= $_GET['id']+&& $bild readdir($handle); $i++);
    @list(
$breite$hoehe$format) = getimagesize($pfad.'/'.$bild) or die("ID ung&uuml;tig");
        
    
$hash md5($bild+breite+filemtime($pfad.'/'.$bild));
    
    if(!isset(
$_GET['thumb'])){
        
header("Location: ".$pfad.'/'.$bild);
        exit;
    }
    else
    {
        if(
file_exists($thumbdir."/".$hash.".jpg")) 
        { 
            
header('Location: '.$thumbdir.'/'.$hash.'.jpg');
        }
        else
        {
            switch(
$format){
                case 
1:
                  
$quellbild imagecreatefromgif($pfad.'/'.$bild);
                  break;
                case 
2:
                  
$quellbild imagecreatefromjpeg($pfad.'/'.$bild);
                  break;
                case 
3:
                  
$quellbild imagecreatefrompng($pfad.'/'.$bild);
            }
            
            
$skalierungsfaktor $breite/$breite_neu;
            
            if ( 
$breite $hoehe )    { $hoehe $breite/1.3;    }
            
$hoehe_neu $hoehe/$skalierungsfaktor;
            
            
$zielbild imagecreatetruecolor($breite_neu,$hoehe_neu);
            
imagecopyresampled($zielbild,$quellbild,0,0,0,0,$breite_neu,$hoehe_neu,$breite,$hoehe);
            
imagejpeg($zielbild$thumbdir."/".$hash.".jpg",100);
            
header('Location: '.$thumbdir.'/'.$hash.'.jpg');
            
closedir($handle);
        }
    }
        
/*}*/
?>
reaLInsanity ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » GalleryScript - Performance Optimierung
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
hilfe bei query optimierung easteregg (Web-) Design und webbasierte Sprachen 2 08.07.09 20:15
640x480 Optimierung webfreak (Web-) Design und webbasierte Sprachen 6 06.02.07 21:31
Doppelte for schleife: performance optimierung Greenberet Code Kitchen 15 25.02.06 14:30
Kernel-Optimierung Nesssus Linux/UNIX 3 24.02.06 13:38
Performance Gast Hackerboard.de-Feedback 12 08.10.01 14:05


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61