| (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, ...
 |
21.07.08, 20:38
|
#1 (permalink)
|
Registriert seit: 10.01.06 Likes: 0 | 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)."\">« Vorherige Seite</a> "; echo "</td><td>"; if(($_GET['seite']+1)*$spalten*$zeilen<$max) echo "<a href=\"".$_SERVER['PHP_SELF'].$getvars."seite=".($_GET['seite']+1)."\">Nächste Seite »</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']+2 && $bild = readdir($handle); $i++); @list($breite, $hoehe, $format) = getimagesize($pfad.'/'.$bild) or die("ID ungü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 :) |
| |
22.07.08, 00:09
|
#2 (permalink)
| | Moderator
Registriert seit: 14.02.06 Likes: 21 | 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 |
| | | |
| | HaBOT
| - Anzeige - |
| |
22.07.08, 10:10
|
#3 (permalink)
| | Member of Honour
Registriert seit: 22.02.07 Likes: 77 | 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") |
| |
22.07.08, 11:08
|
#4 (permalink)
| Themenstarter
Registriert seit: 10.01.06 Likes: 0 | 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. |
| |
22.07.08, 11:47
|
#5 (permalink)
|
Registriert seit: 22.01.07 Likes: 10 | 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. |
| |
22.07.08, 12:50
|
#6 (permalink)
| Themenstarter
Registriert seit: 10.01.06 Likes: 0 | 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)."\">« Vorherige Seite</a> "; } echo "</td><td>"; if(($_GET['seite']+1)*$spalten*$zeilen<$max) { echo "<a href=\"".$_SERVER['PHP_SELF'].$getvars."seite=".($_GET['seite']+1)."\">Nächste Seite »</a>"; } echo "</td>"; } echo "</tr></table></div>";
?> Nur ich find einfach nichts...
Das Beispiel zum ansehen findet ihr [hier] |
| |
22.07.08, 16:38
|
#7 (permalink)
|
Registriert seit: 22.01.07 Likes: 10 | Hm, interessanter wäre die aktuelle inc/create_pic.php ... |
| |
22.07.08, 17:51
|
#8 (permalink)
| Themenstarter
Registriert seit: 10.01.06 Likes: 0 | 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']+2 && $bild = readdir($handle); $i++); @list($breite, $hoehe, $format) = getimagesize($pfad.'/'.$bild) or die("ID ungü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); } /*}*/ ?> |
| |
22.07.08, 18:00
|
#9 (permalink)
|
Registriert seit: 22.01.07 Likes: 10 | 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. |
| |
22.07.08, 18:07
|
#10 (permalink)
| Themenstarter
Registriert seit: 10.01.06 Likes: 0 | 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']+2 && $bild = readdir($handle); $i++); @list($breite, $hoehe, $format) = getimagesize($pfad.'/'.$bild) or die("ID ungü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); } } /*}*/ ?> |
| |  | | |
| | | - Anzeige - |
| | [HaBo]
» Web, Network & Multimedia Palace
» (Web-) Design und webbasierte Sprachen
»
GalleryScript - Performance Optimierung
| Themen-Optionen | | | | Ansicht | Linear-Darstellung |
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. HTML-Code ist aus. | | |
|