Autor Thema: Cache überlisten  (Gelesen 5029 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline dobra

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1353
  • Lob: 18
Cache überlisten
« am: März 17, 2013, 07:36:03 »
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__



Linkback: https://www.shoppilot.net/pf/index.php?topic=1655.0
« Letzte Änderung: März 18, 2013, 07:42:53 von dobra »
mfG
dobra