Fragen zu Thumbnails & Serverüberlastung

than

Mitglied
Guten morgen.

Ich habe ein Fotoalbum Webscript gemacht. Eingebaut ist auch: Wenn man sein homepage Design mal ändert und dann die ganzen Thumbnailbilder zu gross (oder klein) sind, so kann man im Admin Bereich ein paar Buttons klicken und schon werden in einer Schleife alle Thumbnails gelöscht und gegen eine neu eingegebene grösse (höhe x breite) neu generiert.

Meine erste Frage ist: Wie wird es aussehen wenn da mal 50, 100 oder 200 Bilder online sind und ich die neu generieren lasse. Kann da der Webserver sich verhuddeln? Oder wäre es besser nach 30 Bildern (oder so) eine kurze "Zeitpause" einzulegen?
Was meint Ihr dazu?

Meine zweite Frage ist: Wie könnte solch eine "Zeitpause" realisiert werden?
 
Ich würde die Thumbnails bei Bedarf erzeugen.
Dazu sicherst Du irgendwo die aktuell gültigen Größeneinstellungen und anstatt im img-Tag auf ein Bild zu verweisen, verweist Du auf ein PHP-Skript mit Parameter, welches Thumb erzeugt werden soll.
Hier prüfst Du, ob das Thumb bereits besteht. Ist dem nicht so, erzeugst Du es und speicherst es. Dann kannst Du mit [phpf]header[/phpf] und [phpf]fpassthru[/phpf] oder [phpf]readfile[/phpf] das Thumbnail ausgeben. Der erste User, der ein Thumb sehen will, muss also geringfügig länger warten, für alle anderen ist es dann gecacht.

Bei 200 Thumbnails, kann ich mir vorstellen, dass Du an die 30-Sekundengrenze von PHP stößt. Eine Möglichkeit wäre, dass Du 30 Thumbnails erzeugst und dann eine HTML-Seite mit META-Refresh und entsprechender Pause auf dasselbe Skript mit dem GET-Parameter nextThumb=31 sendest. Auf Grund dieses Parameters erzeugt das Skript dann Thumbnail 31 bis 60 und sendet wieder eine HTML-Seite mit META-Refresh und dem GET-Parameter nextThumb=61 und so weiter...
Das ist relativ umständlich und der Admin darf dann auf keinen Fall seinen Browser schließen, daher bevorzuge ich die oben genannte Variante, bei Bedarf die Thumbs zu erzeugen.

Ich hatte mal die Thumbnail-Klasse von Hidayet Dogan angepasst (Truecolor-Support, einzelne Datei) und mit Caching-Funktion versehen. Bei Bedarf kann ich Dir die angepasste Variante per PN zukommen lassen.

Gruß hpvw
 
Grüss Dich.

Wenn ich Dich richtig verstanden habe so lade ich das "original" bild hoch, und wenn dann ein User (Besucher) auf die Galerie klickt werden erst dann die Thumbnails erstellt? das hiesse mit dem Galerie aufruf müssten die entsprechenden Thumbnail dieser Galerie (nenne ich sie mal Flugzeug Galerie) erstellt werden.
Doch dann brauche ich auch ggf. ein Zeitverzögerungs Script.

Wollte dem nächst einen Newsletter für eine Foto Community schreiben, und dort bräuchte ich diese "Schleifen Zeitpause" sowieso. Wie ist so etwas in einem Newsletter gemacht worden? Auch mit dem Meta Refresh? Wäre für mich kein Problem, da der Meta Refresh bei mir im Browser nie deaktiviert wird (aber vielleicht auf einem anderen PC mal wo ich administrieren muss etc.)
 
than hat gesagt.:
Grüss Dich.

Wenn ich Dich richtig verstanden habe so lade ich das "original" bild hoch, und wenn dann ein User (Besucher) auf die Galerie klickt werden erst dann die Thumbnails erstellt? das hiesse mit dem Galerie aufruf müssten die entsprechenden Thumbnail dieser Galerie (nenne ich sie mal Flugzeug Galerie) erstellt werden.
Doch dann brauche ich auch ggf. ein Zeitverzögerungs Script.
Brauchst Du eigentlich nicht. Dabei wird ja für jedes Thumb ein eigenes Skript gestartet. Somit hat der Server für jedes Thumb 30 Sekunden Zeit. Das passiert dann auch nur einmal. Der erste Besucher einer Galerie (welcher auch der Admin selbst sein kann), hat dann halt die A-Karte. Selbst auf meinem 350Mhz-Test-Server ist der einmalige Unterschied zwischen "Thumbs generieren" und "generierte Thumbs durchschleusen" erträglich, wenn man ca. 50 Bilder pro Gallerie hat.

than hat gesagt.:
Wollte dem nächst einen Newsletter für eine Foto Community schreiben, und dort bräuchte ich diese "Schleifen Zeitpause" sowieso. Wie ist so etwas in einem Newsletter gemacht worden? Auch mit dem Meta Refresh? Wäre für mich kein Problem, da der Meta Refresh bei mir im Browser nie deaktiviert wird (aber vielleicht auf einem anderen PC mal wo ich administrieren muss etc.)
Es muss nicht mal ein META-Refresh sein. Vielleicht bringt Dich folgendes Code-Bruchstück ein bisschen weiter:
PHP:
<?php
//Annahme: Du ziehst die Mailadressen aus einer Datenbank:
//Datenbankverbindung herstellen
$text="mailText"; //kommt aus DB

//Anzahl der Mails, die mit einem Aufruf verschickt werden:
$mailsPerCall=30; 

if (!isset($_GET['nextreceiver'])) {
    $nextreceiver=0;
} else {
    $nextreceiver=$_GET['nextreceiver'];
}
$res=mysql_query('SELECT email FROM user LIMIT '.$nextreceiver.','.$mailsPerCall);
anotherCall=false;
while ($row=mysql_fetch_assoc($res)) {
    $email=$row['email'];
    //mailfunktion aufrufen mit Empfänger $email und
    //Mail-Text $text
    $anotherCall=true;
}
if ($anotherCall) {
    //Wenn Du unbedingt eine Zeitverzögerung haben willst, 
    //müsstest Du an dieser Stelle eine ganze HTML-Seite
    //mit entsprechendem META-Refresh ausgeben.
    header('Location: '.
    'http://www.deinServer.de/'.
    'admin/mailversand.php?nextreceiver='.
    ($nextreceiver+$mailsPerCall));
} else {
    echo 'Alle Mails versendet.';
}
?>
 
Grüss Dich.

Ich bin gerade eben von der Nachtschicht heim gekommen, und habe da etwas Zeit gefunden folgenden Code mal schnell zu basteln (aber noch nicht getestet). Sollte so (mit META REFRESH) funktionieren
PHP:
if ($fertig3)
{
$oeffne_bilder = file("bilder.txt"); 
$bildertotal = count($oeffne_bilder);
 
if (!$ex) 
	{ 
	$ex = 0; 
	}
 
for ($ex; $ex < $bildertotal; $ex++) 
	{ 
	 $bildneu = explode("|~|", $oeffne_bilder[$ex]); 
	 $bildwerte = @getimagesize("bilder/00/".$bildneu[1]);
 
	 imagecreatefromJPEG($bildneu[1]); 
	 // + diversen thumbnail code
 
	 $zustand = 100 / $bildertotal * ($ex + 1);
 
	 if ($ex == $bildertotal) 
	 { 
		echo $ex." Thumbnails neu erstellt."; 
		echo "<meta http-equiv=\"refresh\" content=\"2; url=admin.php\">"; 
	 } 
else { 
		echo $zustand." % erstellt"; 
		echo "<meta http-equiv=\"refresh\" content=\"0; url=\"admin.php?fertig3=1&fertig4=1&ex=".$ex."\">"; 
	 }
 
	} 
 
}

Ich habe da aber noch eine generelle Frage. Worin liegt der Unterschied zwischen Deiner Art von Fotoscript und dem so wie ich es schon fertig gebastelt habe? Ich muss sagen das ich meine Variante besser finde, weil ich direkt nach dem uploaden der/des Bilder/s (und somit beim erstellen der Thumbnails) sofort den genauen Speicherplatzverbrauch auf dem Webserver weiss.
Und ich schliesse aus, das spätere Scriptfehler auftreten können, die ggf. durch veränderte Schreibrechte- oder ändern der Ordnernamen - oder Pfades auftreten können.
Ich meine es ist ja nur der Unterschied zu Deinem das der Speicherplatz der Thumbnails noch nicht genutzt wird (beim uploaden). Vielleicht habe ich aber auch etwas wesentliches nicht bedacht. Doch dazu bin ich jetzt zu Müde. Ich hau mich nun mal aufs Ohr und wenn ich wieder aufftehe, prüfe ich das Script hier mal : )

Also schönen Tag Euch
 
Der Unterschied der Skripte dürfte klar sein ;)
Diskutieren wir also die Vor- und Nachteile:
Du hast recht, dass Du als Admin bei Deinem Skript die größere Kontrolle hast, da Du sofort einen Haufen Errors siehst, wenn die Thumbnailerstellung nicht funktioniert. Im Gegensatz zu vielen anderen Fragestellern in diesem Forum hatte ich jedoch noch nie Probleme mit Schreibrechten oder damit, dass ein getestetes Skript auf einmal nicht mehr funktioniert (morgen wird mir mein Webserver also den Stinkefinger zeigen und sich nicht mehr beschreiben lassen, übermorgen funktionieren meine Skripte nicht mehr, Murphys Law).
Das Ändern von Verzeichnissen wirkt sich auf alle Deine Skripte aus, die Links setzen oder Bilder einbinden. Der Fehler ist damit vorprogrammiert, egal, auf welche Weise Du die Thumbs erzeugst.
Der Speicherverbrauch von Thumbs ist im Vergleich zum Rest der Seite Vergleichsweise gering, das war für mich nie ein Argument, denn irgendwann sind sie eh alle generiert. Wo Du es jedoch ansprichst: Sollte es auf dem Server wirklich eng werden, bietet sich mit einem Skript meiner Variante die Möglichkeit, alle Thumbs zu löschen und das Caching zu deaktivieren. Das ist der klassische Trade-Off zwischen Speicherplatzverbrauch und Rechenzeit (der hier im Normalfall klar von "Speicherplatz nutzen und Rechenzeit reduzieren" gewonnen wird). Du würdest jedoch ein bisschen Zeit gewinnen, um auf den letzten Drücker noch ein größeres Webhosting-Paket zu bestellen. Naja, aber das Argument zieht nicht wirklich.
Ich sehe für mich den größten Vorteil in der leichteren Wiederwendbarkeit und Aktualisierbarkeit. Je nach dem, wie sauber Du programmiert hast (Stichwort OOP) wirst Du Dein Skript auch gut wiederverwenden können. Wenn ich ein neues Projekt habe, mache ich es einfach so, dass ich das Thumbnailskript auf den neuen Webserver kopiere und egal, ob ich es für eine Gallerie einsetze oder für etwas anderes, im sonstigen Code die passenden Links setze, die ich sonst auf ein fertig generiertes Thumb setzen würde.
Wenn ich mein Thumbnailer ändere (z.B. von imagecreate und imagecopyresized auf imagecreatetruecolor und imagecopyresampled) kopiere ich einfach das neue Thumbnailskript auf den Server und lösche die gecachten Thumbs, der Rest erledigt sich von alleine. In der anderen Variante müsstest Du noch ein Skript haben oder schreiben, mit dem Du alle Thumbs neu generierst.
Welche Variante nun objektiv besser oder schlechter ist, varmag ich nicht zu beurteilen. Ich komme mit einem live generierten Thumbnail und meiner Caching-Variante seit Jahren sehr gut zurecht, kann aber nicht beurteilen, ob sie auch für Dich das geeignete Mittel ist.
Mir wäre der Aufwand zu hoch, für alle erdenklichen Fälle der Erzeugung und Änderung den passenden Direktor zur Thumbnailgenerierung zu schreiben.

Gruß hpvw
 
huhu, ich muss dir noch 2 mal wiedersprechen :rolleyes:
Das mein Script eines Tages mal nicht mehr funktionieren könnte - und ich es vielleicht erst Tage oder Wochen später bemerke, so etwas hatte ich schon einmal. Gebe Dir recht, das Ordner umbenennen keine Fehlerquelle im Sinne automatisch auftretender Fehler ist. Bei mir war einmal das mit einem Sicheren Session Login Script. Wo man von Heute auf Morgen sich nicht mehr einloggen konnte, weil der url Pfad zum Script nicht auf dem "Hauptfpad" lag sondern bei einem 2 Anbieter (Threadm im Forum).

Als weiteres zu den Thumbnails. Ich habe nicht gesagt, das ich pro hochgeladenes Bild 3 Thumbnails erstelle. Der Speicherplatz verbrauch ist daher schon recht fortgeschritten.

Bild 1 ist das original Foto welches bis 800 x 700 gross sein darf.

Thumbnail 1 wird 80 x 80% verkleinert und bekommt mein Wasserzeichen

Thumbnail 2 wird 20 x 20% verkleinert und wird das Galerie Vorschaubild

Thumbnail 3 wird 8 x 8% verkleinert und wird im Admin Bereich angezeigt mit einem lösch Button dahinter

Die 3 verschiedenen % Grössen kann ich alle online im Admin bereich ändern.
Über eine schon vorhandene Funktion kann ich nun jeder Zeit egal welche der 3 Thumbnail Gruppen neu erstellen lassen, weil ich das Original Foto ja auch mit hochgeladen habe. (somit kann ich auch das Wasserzeichen mal ändern) und der Hauptgrund, wenn ich (leider recht oft) mein HP Design ändere, so könnten doofe Scrollbalken auftreten weil die Bilder evt. zu Hoch etc. sind. Also kann ich sie alle z.b. 70 x 70% im Handumdrehen verkleinern.

Somit ist der Thumbnailspeicherplatz schon recht gross. Da ich Naturfotograf bin, kommen da nur qualitativ hochwertige Fotos auf den Server. Es werden nicht so viele Werden, aber die wenigen werden schon eine gute kb grösse haben, um eine sehr gute Bildqualität online noch zu haben.

Da Du mir so Gut hier geholfen hast- und mich neugierig gemacht hast auf Deine Möglichkeit, bitte ich um Dein Script trotzdem, oder um einen Link von Dir wo ich es mal sehen kann (glaube aber besser wäre es, es selber zu haben um mich damit richtig zu befassen).

Grüsse Andreas
 
Guten Morgen.

Die PM ist zu Dir unterwegs.

Ich habe nun mal versucht die Thumbnail-neu-generier Funktion so zu machen, dass nach jedem Bilddurchlauf das Script verlassen wird - die Seite neu refresh't wird und dann sollte das Script (mit dem bildparameter um 1 erhöht) das nächste Bild generieren.
(mein obriger code ist hinfällig und wenn ich den meta refresh benutze, brauche ich keine schleife mehr)

Das problem wird wohl sein, das man mit einem META REFRESH keine variablen mit übergeben kann :(
PHP:
$ex++;
echo "<meta http-equiv=\"refresh\" content=\"0; url=\"admin.php?bildweiter=".$ex."\">";

Somit wird das wohl nichts werden, oder weisst Du noch eine Lösungsmöglichkeit?


Ich habe noch set_time_limit() gefunden. Wäre als Notlösung für eine Schleifenausgabe brauchbar um die Zeit zu begrenzen.
 
Folgender Code (auch mit 0 Sekunden) funktioniert bei mir (Win2k-Server, Apache 2, PHP 5, Firefox 1.0, Netscape 7.1 und Internet Explorer 6):
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type"
    content="application/xhtml+xml; charset=UTF-8" />
<title>Test</title>
<?php
    $i=(empty($_GET['i']))?0:$_GET['i'];
    $i++;
    echo '<meta http-equiv="refresh" content="2; '.
        'url=./metarefresh.php?i='.$i.'" />';
?>
</head>
<body>
<p>
<?php
    echo $i;
?>
</p>
</body>
</html>
Alle zwei Sekunden lädt die Seite neu und zählt i um 1 hoch. Solltest Du keine Ausgabe machen und keine "echte" Pause benötigen, würde ich jedoch die Variante mit [phpf]header[/phpf] vorziehen. Dann sollte es mit keinem Client Probleme geben. Mit Pause verlagerst Du das Problem ohnehin nur und das Administrieren dauert länger. Bei [phpf]header[/phpf] solltest Du jedoch beachten, dass Du eine absolute URI angeben musst.

Gruß hpvw
 
Guten Morgen.

Also das mit der header() funktion hatte ich schon ausprobiert und funktioniert, aber ich würde noch mit jedem Bild-erstellungs-durchlauf ein Prozent counter mitlaufen lassen und bei jedem durchlauf wird angezeigt wie viel % schon erledigt ist. Mit dem header() geht es so nicht, darum wäre der meta refresher besser.

Und in Deinem kleinen Testscript funktioniert das Variablen übergeben, aber in meinem Script nicht. Um nicht lang um den Brei zu reden, habe ich mein ganzes Script gekürzt so das nun nur noch das einfachste und wichtigste zum testen übrig geblieben ist, und wie Du gleich sehen wirst funktioniert es da nicht.
Im Anhang ist die Test Datei (musst nur in a.php umbenennen).
Bin wirklich mal gespannt wo da mein Fehler liegt. Hab die ganze Nacht da dran gegrübelt.

ps.: Danke auch für deine email, ich hab aber noch nicht reingucken können.
 

Anhänge

  • a.txt
    a.txt
    2,8 KB · Aufrufe: 39
Zurück