2010-05-13 7 views
7

Ich habe ein Bild Resizer in PHP gemacht. Wenn ein Bild in der Größe geändert wird, speichert es eine neue JPG-Datei mit den neuen Dimensionen. Das nächste Mal rufen Sie die genaue img.php? File = hello.jpg & size = 400 es überprüft, ob das neue jpg wurde bereits erstellt.Was ist effizienter/schneller beim Aufruf eines gecachten Bildes?

  1. Wenn es noch nicht erstellt wurde, erstellt es die Datei und druckt dann die Ausgabe (cool).
  2. Wenn ALREADY vorhanden ist, muss keine neue Datei generiert werden und stattdessen wird nur die bereits zwischengespeicherte Datei aufgerufen.

Meine Frage bezieht sich auf das zweite Szenario. Welche davon ist schneller?

  1. Umleiten: header('Location: cache/hello_400.jpg');die();
  2. Daten und Drucken der Cache-Datei Grabbing: $data = file_get_contents('cache/hello_400.jpg'); header('Content-type: '.$mime); header('Content-Length: '.strlen($data)); echo $data;

noch andere Möglichkeiten, dies zu verbessern?

Wenn jemand den generierten Code will, check this out: http://egobits.com/misc/img.phps

Vielen Dank an alle für die Hilfe!

+0

Eine gute Frage (ich bin nicht sicher, welche schneller ist). – JYelton

Antwort

3

Gibt es noch andere Möglichkeiten, dies zu verbessern?

Ja.

Es gibt eine Möglichkeit, nichts als nur einen HTTP-Header zu senden: a bedingte erhalten.
Sie können einen Blick auf die ähnliches Skript nehmen, http://shiftingpixel.com/2008/03/03/smart-image-resizer/, für die Umsetzung der folgenden

+0

Das hat perfekt funktioniert. Wenn das Bild nicht existiert, erstellt das Skript das neue in der Größe veränderte img und speichert es zwischen. Wenn Sie das nächste Mal den gleichen Link anfordern, führt das Skript den zwischengespeicherten Browser img aus. Vielen Dank. – andufo

+0

Wenn jemand den generierten Code möchte, überprüfen Sie dies: http://egobits.com/misc/img.phps – andufo

+0

Sie können überprüfen, mit readfile() anstelle von file_get_content, weil die ganze Datei nie in PHP und geladen wird wird direkt an den Benutzer gesendet –

5

Ich würde entscheiden, niemals die Daten in den Browser zu drucken. Beide Szenarien sollten eine permanente Weiterleitung an das generierte Bild auslösen. Außer wenn das Bild noch nicht existiert, wird es erstellt, bevor der Location-Header gesendet wird.

Edit:

Nur klar zu sein über das, was ich durch dauerhafte Umleitung meine ...

header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://path/to/image'); 
+0

zu Matt hinzufügen, kann es das Bild über die Internetpunkte vom Browser zum Proxy-Server zwischenspeichern. – Rohit

0

Als dritte (Stärkerer) Option: das Bild in einem binären Feld Cache eine Datenbank und fragen Sie die Datenbank danach ab.

Implementieren Sie alle drei Lösungen und benchmarken Sie sie.

Ich gehe davon aus, dass die erste Option (Redirect) die langsamste in der realen Welt sein wird, weil es genauso viel Aufwand wie die zweite Option (file_get_contents) erfordert, aber eine zweite Anfrage und mehr Aufwand beinhaltet.

5

Vielleicht Sie tun können:

  1. Set für diese Bilder etwas Verzeichnis.
  2. Link zu Bildern in diesem Verzeichnis (<a href="/img/resizable/hello_400.jpg>).
  3. Richten Sie Ihren Webserver so ein, dass er auf Ihr PHP-Skript umleitet, falls das Bild noch nicht existiert. Wenn Sie auf Apache sind, genügt ein einfacher .htaccess. In PHP haben Sie $_SERVER["REQUEST_URI"], aus dem Sie erkennen können, welches Bild Sie in der Größe ändern sollten.
  4. Ihr Skript speichert und echo das Bild (wird aber nur zum ersten Mal aufgerufen).

Auf diese Weise können, kommen einige Vorteile:

  • Das Bild (in einem Proxy oder einem Browser) als jede andere statische Datei zwischengespeichert wird.
  • PHP muss nicht für jede Anforderung aufgerufen werden, nur um statische Daten umzuleiten oder auszugeben.
  • Sie verlassen die Implementierung von If-modified-since und andere Cache-bezogene Header zum Webserver.
  • Und die Links schöner aussehen :-)

Beispiel .htaccess in Ihrem/img/resizable Ordner:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* /img.php [L] 
+0

+1 Ich stimme zu. Delegieren Sie so weit wie möglich an Apache, rufen Sie PHP nur dann an, wenn es tatsächlich benötigt wird. – Matt

0

Wenn möglich, in Ihrem Fall, können Sie auch eine Funktion implementieren, um direkt eingestellt die uRL des im Cache gespeicherten Bildes in Ihrem html wie:

<img src="<?php getImageUrl('hello.jpg', 400); ?>" /> 

getImageUrl() wird die uRL des im Cache gespeicherten Bildes zurück, wenn es sonst existiert es wird die uRL dynamisch ge zurückkehren niere das skalierte Bild neu.

Verwandte Themen