Frage

Was wäre der beste Praxis Weg das Caching von Bildern mit PHP zu behandeln.

Der Dateiname zur Zeit in einer MySQL-Datenbank gespeichert ist, die zu einer GUID beim Upload umbenannt wird, zusammen mit dem ursprünglichen Dateinamen und Alt-Tag.

Wenn das Bild in die HTML-Seiten gesetzt wird es gemacht wird so eine URL wie ‚/images/get/200x200/{guid}.jpg verwendet, die zu einer PHP-Skript neu geschrieben wird. Dies ermöglicht es meine Designer (grob - das Quellbild vielleicht kleine) angeben, die Dateigröße.

Das PHP-Skript erstellt dann einen Hash der Größe (200x200 in der URL) und die GUID Dateinamen und wenn die Datei vor (mit dem Namen des Hash existiert in TMP-Verzeichnis-Datei) sendet die Datei von der Anwendung erzeugt wurde, TMP-Verzeichnis. Wenn der Hash-Dateiname nicht vorhanden ist, dann wird es erstellt, auf der Platte geschrieben und auf die gleiche Art und Weise serviert,

Ist das effizient, wie es sein könnte? (Es unterstützt auch die Bilder Watermarking und die Watermarking-Einstellungen werden in der Hash als auch gespeichert, aber das ist außerhalb des gültigen Bereichs für diese.)

War es hilfreich?

Lösung

Es gibt zwei Fehler in Dan Udey das Beispiel für das Umschreiben (und ich kann nicht kommentieren), es sollte eher sein:

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]

Viele Grüße.

Andere Tipps

Ich würde es auf eine andere Art und Weise tun.

Probleme: 1. Mit PHP Dateien absitzen ist weniger effizient als sie sein könnte. 2. PHP hat die Existenz von Dateien ein Bild jedes Mal überprüfen angefordert wird 3. Apache ist viel besser auf diesem als PHP jemals sein wird.

Es gibt einige Lösungen hier.

Sie können mod_rewrite auf Apache verwenden. Es ist möglich, mod_rewrite zu verwenden, um zu testen, um zu sehen, ob eine Datei vorhanden ist, und wenn ja, anstatt die Datei dienen. Dies umgeht PHP völlig und macht die Dinge viel schneller. Der eigentliche Weg, dies zu tun, obwohl, wäre ein bestimmtes URL-Schema zu generieren, die immer existieren sollen, und dann PHP umleiten, wenn nicht.

Zum Beispiel:

RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]

Also, wenn ein Client /images/cached/<something> anfordert und diese Datei nicht existiert bereits, wird umleiten Apache die Anforderung an /images/generate.php?/images/cached/<something>. Dieses Skript kann dann das Bild erzeugen, schreiben Sie es in den Cache, und es dann an den Client senden. In Zukunft wird der PHP-Skript nie außer für neue Bilder genannt.

Verwenden Caching. Als ein weiteres Plakat sagte, verwenden Dinge wie mod_expires, Last-Modified-Header etc. zu bedingten GET-Anfragen zu reagieren. Wenn der Kunde muss nicht erneut Anfrage Bilder, Seite geladen wird sich dramatisch beschleunigen, und die Last auf dem Server verringern.

Für Fälle, in denen Sie ein Bild von PHP haben zu senden, können Sie mod_xsendfile verwenden Sie es mit weniger Aufwand zu tun. Siehe die ausgezeichnete Blog-Post von Arnold Daniels auf die Frage, beachten Sie jedoch, dass sein Beispiel für Downloads ist. Zum Servieren Bilder inline, nehmen Sie die Content-Disposition-Header (der dritte header () Aufruf).

Hope, das hilft - mehr nach meiner Migräne aufräumt

.

Eine Anmerkung wert ist das Hinzufügen um sicherzustellen, dass Sie Code nicht „nicht autorisierte“ Größen dieser Bilder erzeugt.

So ist die folgende URL eine 200x200-Version von Bild 1234 erstellen, wenn man nicht bereits vorhanden ist. Ich würde sehr vorschlagen, dass Sie sicherstellen, dass die angeforderte URL Bild Dimensionen enthält, die Sie unterstützen.

/images/get/200x200/1234.jpg

Ein bösartiges Person kann beginnen zufälligen URLs anfordert, immer die Höhe und Breite des Bildes zu verändern. Dies würde dem Server einige ernsthafte Probleme verursachen b / c es dort sitzen werden, im Wesentlichen unter Beschuss, Bilder von Größen zu erzeugen Sie nicht unterstützen.

/images/get/0x1/1234.jpg
/images/get/0x2/1234.jpg
...
/images/get/0x9999999/1234.jpg
/images/get/1x1/1234.jpg
...
etc

Hier ist ein zufälliges schnipp Code darstellt dies:

<?php

    $pathOnDisk = getImageDiskPath($_SERVER['REQUEST_URI']);

    if(file_exists($pathOnDisk)) {
        // send header with image mime type 
        echo file_get_contents($pathOnDisk);
        exit;
    } else {
        $matches = array();
        $ok = preg_match(
            '/\/images\/get\/(\d+)x(\d+)\/(\w+)\.jpg/', 
            $_SERVER['REQUEST_URI'], $matches);

        if(! $ok) {
            // invalid url
            handleInvalidRequest();
        } else {
            list(, $width, $height, $guid) = $matches;

            // you should do this!
            if(isSupportedSize($width, $height)) {
                // size is supported. all good
                // generate the resized image, save it & output it
            } else {
                // invalid size requested!!!
                handleInvalidRequest();
            }
        }
    }

    // snip
    function handleInvalidRequest() {
        // do something w/ invalid request          
        // show a default graphic, log it etc
    }
?>

Es scheint großen Beitrag, aber mein Problem bleibt nach wie vor ungelöst. Ich nicht in meinem Host-Provider den Zugang zu .htaccess haben, so dass keine Frage von Apache Zwicken. Gibt es wirklich einen Weg cace-control-Header für Bilder einstellen?

Ihr Ansatz scheint durchaus sinnvoll - ich möchte hinzufügen, dass ein Mechanismus in Position gebracht werden sollte, um zu überprüfen, dass das Datum der Cache-Version erzeugt wurde nach der letzten Änderung Zeitstempel der ursprünglichen (Quelle) Bilddatei war und wenn nicht die im Cache gespeicherten regenerieren / Größe verändert Version. Dadurch wird sichergestellt, dass, wenn ein Bild von den Designern geändert wird die Cache entsprechend aktualisiert wird.

Das klingt wie eine solide Art und Weise, es zu tun. Der nächste Schritt kann über PHP / MySQL zu gehen.

Vielleicht optimieren Sie Ihre Header :

Wenn Sie PHP verwenden MIME-Typen zu senden, können Sie auch ‚Keep-alive‘ und ‚Cache-Control‘ Header die Lebensdauer Ihrer Bilder auf dem Server zu erweitern und einen Teil der Last von PHP nehmen / MySQL.

Auch betrachten Sie Apache-Plugin (s) für das Caching auch. Wie mod_expires .

Oh, eine Sache, wie viel Kontrolle haben Sie über Ihren Server? Sollten wir dieses Gespräch zu begrenzen nur PHP / MySQL?

Ich habe es geschafft, dies einfach zu tun, eine Umleitung-Header in PHP:

if (!file_exists($filename)) {  

    // *** Insert code that generates image ***

    // Content type
    header('Content-type: image/jpeg'); 

    // Output
    readfile($filename);    

} else {
    // Redirect
    $host  = $_SERVER['HTTP_HOST'];
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    $extra = $filename;
    header("Location: http://$host$uri/$extra");
}

Anstatt die Dateiadresse in der DB zu halten ich eine Zufallszahl an die Dateinamen hinzugefügt vorziehen, wenn sich der Benutzer anmeldet So etwas wie dies für Benutzer 1234:.? Image / picture_1234.png rnd = 6534122341

Wenn der Benutzer ein neues Bild trägt während der Sitzung, die ich die Zufallszahl nur aktualisieren.

GUID befasst sich mit dem Cache-Problem 100%. es macht aber irgendwie schwieriger ist es, den Überblick über die Bilddateien zu halten. Bei dieser Methode gibt es eine Chance könnte der Benutzer das gleiche Bild wieder zu einem späteren Login sehen. Allerdings sind die Chancen gering sind, wenn Sie Ihre Zufallszahl von einer Milliarde Zahlen erzeugen.

phpThumb ist ein Rahmen, der verkleinerten Bilder / Thumbnails on the fly erzeugt. Es implementiert auch Caching und es ist sehr einfach zu implementieren.

Der Code ein Bild, um die Größe ist:

<img src="/phpThumb.php?src=/path/to/image.jpg&w=200&amp;h=200" alt="thumbnail"/>

geben Sie eine Miniaturansicht von 200 x 200;

Es unterstützt auch Watermarking.

Überprüfen Sie es heraus an: http://phpthumb.sourceforge.net/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top