Laravel-Header und Caching in php
Habe ich eine kleine Bild-generator als Teil meiner laravel4 Anwendung. Es dauert etwa 700ms um das Bild zu erzeugen, und so habe ich begonnen, die Zwischenspeicherung der generierten Ergebnis auf meinem server und der Rückkehr, dass der browser statt und spart etwas Zeit.
Als die Bild wird sich nie ändern, einmal erzeugt, ich wollte sagen, der browser-cache, um das Bild lokal und ich haben dies mit dem folgenden code:
$path = $cacheFolderPath . $cacheFileName;
if (File::exists( $path )){
$response = Response::make(File::get($path));
$response->header('Content-Type', 'image/png');
$response->header('Content-Disposition', 'inline; filename="'.$cacheFileName.'"');
$response->header('Content-Transfer-Encoding', 'binary');
$response->header('Cache-Control', 'public, max-age=10800, pre-check=10800');
$response->header('Pragma', 'public');
$response->header('Expires', date(DATE_RFC822,strtotime(" 2 day")) );
$response->header('Last-Modified', date(DATE_RFC822, File::lastModified($path)) );
$response->header('Content-Length', filesize($path));
return $response;
}
Dieser sendet ein Bild mit status-code 200 OK
an den browser mit den folgenden überschriften:
Cache-Control:max-age=10800, pre-check=10800, public
Connection:Keep-Alive
Content-Disposition:inline; filename="pie_0_normal.png"
Content-Length:2129
Content-Transfer-Encoding:binary
Content-Type:image/png
Date:Wed, 07 Aug 2013 10:29:20 GMT
Expires:Fri, 09 Aug 13 10:29:20 +0000
Keep-Alive:timeout=5, max=93
Last-Modified:Wed, 07 Aug 13 10:14:42 +0000
Pragma:public
Server:Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
Set-Cookie:laravel_session=767487mhf6j2btv3k01vu56174; expires=Wed, 07-Aug-2013 12:29:20 GMT; path=/; httponly
X-Powered-By:PHP/5.4.7
Mein Problem ist, dass meine browser (chrome, nicht getestet, in anderen immer noch weigert, greifen einfach zu der lokal zwischengespeicherten version und stattdessen trifft Sie den server erneut.
Verbrachte ich etwa eine halbe Stunde mit der Suche nach anderen Fragen zu diesem Thema und alle haben mir zu Antworten, die ich integriert habe in dem obigen code. Also, während ich weiß, dass es ähnliche Fragen, dieser ist einzigartig für die oben genannten Quell-code.
Meine Frage ist, was mache ich falsch, dass die Datei nicht vom browser zwischengespeichert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine alternative Methode wäre, zu prüfen, für die 'If-Modified-since" request-header, so wie es ist nur vorhanden, wenn der browser bereits über die Datei.
Wenn es vorhanden ist, dann Sie wissen, dass die Datei bereits erstellt und kann darauf reagieren mit einem link, um es, andernfalls führen Sie den code oben. So etwas wie dieses...
Es scheint, dass Sie immer noch sagen, Laravel, um laden Sie die asset und dienen der Reaktion als download, können Sie einen Cache-Control-header, aber es spielt keine Rolle, weil Sie re-generieren dieser asset-jedes mal, wenn das Bild geladen ist.
Ich lief in ein ähnliches problem und mich gefunden, der beste Weg, um zu dienen die Bilder war, zu injizieren eine statische Funktion in meiner Sicht so etwas wie ImageController:fetchImage($Bild).
Die Methode wird dann überprüfen Sie einen lokalen Ordner, um zu sehen, wenn die Datei vorhanden ist und dann wird es einfach nur wieder die Position des Bildes, so etwas wie: /img/1332.jpg... Wenn die Datei nicht existiert, wird er das image erstellt, speichern Sie es in den img-Ordner und dann wieder die Lage.
Dies vermeidet laravel von jemals zu dienen, bis eine neue (nicht zwischengespeicherten) Reaktion als download JEDES mal, wenn das Bild angefordert wird, und stattdessen leitet den browser zum laden von Ressourcen, die sich bereits im Cache.
Dies funktionierte in meinem Fall ist...