Ladezeiten von Bildern (DB)

Hi,

ich habe ein script aufgesetzt, welches Bilder aus einem Ordner (bzw. Dateien) anzeigen soll, ohne das dieser Pfad existiert:

Aufruf: (Url)
xxx.de/images/bild1.jpg

Dieses Bild liegt hier: (Bild-Pfad)
xxx.de/ordnername/ordner2/bild1.jpg

Wenn ich diese URL nun aufrufe, dauert es (geschätzt 1sec) länger, um das Bild anzuzeigen als würde man direkt den Bild-Pfad öffnen.
Hier das Script:

<?php $EX=>URL, welche eingegeben wurde (ohne Endung, also z.B.: jpg) $end=> endung der URL (der Datei, z.B.: jpg) ############## ############## ############## ############## ############## $img=explode('/',$EX); if($end==''){header('Status: 301 Moved Permanently'); exit();} $c='';if($end=='gif')$c='image/gif'; elseif($end=='jpeg' or $end=='jpg')$c='image/jpeg'; elseif($end=='png')$c='image/png'; elseif($end=='css')$c='text/css'; elseif($end=='js')$c='text/javascript'; elseif($end=='json')$c='application/json'; elseif($end=='pdf')$c='application/pdf'; elseif($end=='rss')$c='application/rss+xml; charset=ISO-8859-1'; elseif($end=='txt')$c='text/plain'; elseif($end=='xml')$c='text/xml'; elseif($end=='atom')$c='application/atom+xml'; $img=implode('/',$img); $img='ROOT-Verzeichnis/ordnername/ordner2/'.$img.'.'.$end; if($c!=''){ header('Content-Type:'.$c); readfile($img); }else header('Status: 301 Moved Permanently'); exit(); ?>

Hat jemand eine Idee, wie man die Ladezeiten von Bildern mit diesem Script beschleunigen kann?
Oder besser: Weiß jemand wie z.B.: Joomla, WordPress, etc. die Bilder Auslesen, da liegen die Bilder auch nicht in dem Verzeichniss, welches man über die URL anwählt, und diese werden sehr schnell ausgegeben.

Danke schon mal für die Anregungen.

PS: das ganze wird im späterem Rahmen über eine DB laufen, wo der reale Pfad zu dem Bild hinterlegt ist.

Das Problem beim Ausgeben von statischen Dateien per Script ist, dass du dich so selbst um das Caching der Dateien im Browser kümmern musst (HTTP Header “If-Modified-Since” etc. vom Client beachten). So wird die Datei bei jedem Abruf in seiner kompletten Form übertragen, unabhängig davon ob sie bereits zuvor übertragen wurde oder nicht.

Es ist also durchaus ratsam, die Dateien einfach vom normalen Webserver, der sich bereits um das ganze Caching kümmert, ausgeben zu lassen.
Generell solltest du das für alle statischen Dateien so machen (CSS, JS, Bilder, usw.).

Außerdem wird das ausführen eines PHP Scriptes wohl immer etwas langsamer sein als das direkte ausgeben einer Datei. Ich denke aber das liegt nicht daran, sondern eher am fehlenden Caching.

Ich bin mir außerdem ziemlich sicher, dass Joomla und WordPress statische Dateien ebenfalls direkt vom Webserver, statt von einem Script ausgeben lassen. Außnahmen sind vllt Uploads, die vor Unauthorisiertem Zugriff geschützt werden müssen (was man bei den meisten Dateien getrost auslassen kann). Dort wird dann aber mit sicherheit auch vernünftig auf das Caching geachtet.

Gruß Balmung

PS:
Der 301 Status erwartet immer einen “Location” Header. Dieser wird dazu genutzt anzugeben, dass eine bestimmte Ressource auf dem Webserver nicht mehr an dem aufrerufenen Ort zu finden ist, sondern an einem anderen Ort. Dieser Ort wird immer mit dem “Location” Header angegeben. Wenn es keinen neuen Ort gibt, solltest du besser “404 Not Found” nutzen.
http://en.wikipedia.org/wiki/HTTP_301

PPS:
Nutze bitte IMMER geschweifte Klammern bei If-Abfragen und Schleifen. Auch wenn nur ein einziger Befehl auszuführen ist, bleibt es trotzdem schlechter Stil, der sehr leicht zu Fehlern führen kann.

Das sind doch offenbar statische Dateien, da ist es weder notwendig noch sinnvoll, diese
per readfile einzulesen, um sie lediglich ohne Änderung wieder auszugeben.
Das kostet nur unnötig Rechenleistung.
Es besteht sogar das Gerücht, daß die Funktion so schlecht ist, daß PHP dabei sogar versucht,
den Inhalt der Datei zu analysieren, statt das einfach blind wie bei einem normalen Aufruf
auszugeben. Wenn dem wirklich so ist, ist nachvollziehbar, warum die Ausgabe deutlich länger dauert.

Wenn Joomla, WordPress ähnliche Skripte verwenden, um statische Dateien durch den
PHP-parser laufen zu lassen, ohne daran etwas zu ändern, so sind diese Programme einfach
sehr schlecht und man sollte sie nicht verwenden.
Indessen können die natürlich auch einfach die Pfade per link oder .htaccess umbiegen, dann
sieht die Angelegenheit ganz anders aus, weil dann das PHP mit den Dateien nichts mehr zu
tun hat, sondern das Dienstprogramm die Dateien einfach statisch ausgibt.
Anders sieht es auch aus, wenn bei jedem Aufruf eines Bildes eine Änderung am Bild
vorgenommen wird oder ein neues Bild erzeugt wird. Dann ergibt das einen Sinn und man muß
auch in Kauf nehmen, daß der PHP-parser Zeit und Rechenleistung braucht, um das neue Bild
zu erzeugen.