Cache überlisten

Begonnen von dobra, März 17, 2013, 07:36:03

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

dobra

Hallo,

Der Browsercache ist ja im Prinzip eine gute Sache: kommt ein Besucher mit dem selben Browser öfter in den Shop, müssen die Dateien (Bilder, JS-, CSS-Dateien u.a.) nicht immer wieder neu vom Server heruntergeladen werden, sondern stehen dank des Caches auf der Festplatte ihres Besuchers zu Verfügung.

Aber manchmal sollten geänderte Dateien - z.B. eine CSS Datei, die zwar immer noch den selben Dateinamen hat (z.B. style.css) - auch OHNE F5 aktualisiert werden.
Auch wenn der Kunde die F5-Funktion kennt (was nicht bei allen vorausgesetzt werden kann ;) ) woher soll er wissen, dass Sie einige Elemente auf Ihrer Seite verändert haben und er den Browsercache mit der F5 Taste aktualisieren soll ?

Die Lösung (sofern der Webserver das unterstützt) sieht so aus, dass man - im Beispiel die css-Datei (funktioniert nach dem selben Prinip auch mit jeder anderen extern eingebundenen Datei) - mit abweichendem Parameter in die Seite schreibt.
Das sieht dann zb so aus:
<link rel="stylesheet" type="text/css" href="../css/style.css?v=20130309170945">
Wobei der Parameter die Zeit ist, wann die Datei zuletzt geändert wurde.

Dieser Code von ahe erzeugt solche Links automatisch:
<!--spmacro:module(lib)
our $CATDIR = $ssp::catalog_abs;
$CATDIR = $ssp::sec_catalog_abs if ($ENV{HTTPS} eq 'on');

sub _getFilenameWithTimeParam {
   my $file = $_[0];
   $file =~ s/$CATDIR\///;

  my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($main::catalog_home . "/" . $file);
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
   return sprintf("%s?v=%04d%02d%02d%02d%02d%02d", $CATDIR . "/" . $file, $year+1900, $mon+1, $mday, $hour, $min, $sec);
}

sub csslink {
main::mprint(qq|<link rel="stylesheet" type="text/css" href="|._getFilenameWithTimeParam("$CATDIR/css/main.css").qq|">|);
}
-->


Im Template dann
<link rel="stylesheet" href="../css/stile.css">
mit obigem Code und  __lib::csslink__  ersetzen
-> der Besucher sieht immer sofort die aktualisierte Version OHNE die Seite selbst aktualisieren zu müssen  ;D

Funktioniert auf dynamischen und statischen Seiten.

Nachtrag:
Wenn man das
_getFilenameWithTimeParam
mehrmals (auf verschiedenen Seiten und/oder für unterschiedliche Dateien) verwenden will, kann man auch den globalen Teil in die stdall.ipl schreiben
<!--spmacro:module(lib)
our $CATDIR = $ssp::catalog_abs;
$CATDIR = $ssp::sec_catalog_abs if ($ENV{HTTPS} eq 'on');

sub _getFilenameWithTimeParam {
   my $file = $_[0];
   $file =~ s/$CATDIR\///;

  my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($main::catalog_home . "/" . $file);
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
   return sprintf("%s?v=%04d%02d%02d%02d%02d%02d", $CATDIR . "/" . $file, $year+1900, $mon+1, $mday, $hour, $min, $sec);
}
-->


und kann dann die einzelnen Dateien so einbinden
<!--spmacro:module(lib)
sub csslink {
main::mprint(qq|<link rel="stylesheet" type="text/css" href="|._getFilenameWithTimeParam("$CATDIR/css/main.css").qq|">|);
}
sub jslink {
main::mprint(qq|<script type="text/javascript" src="|._getFilenameWithTimeParam("$CATDIR/ajax/xyz.js").qq|"></script>\n|);
}
sub irgendwas {
...
}
-->

__lib::csslink__
__lib::jslink__
__lib::irgendwas__

mfG
dobra