Alt 04.09.2011, 16:51:34   #1 (permalink)
Erfahrener Benutzer

ID: 174417
Lose-Remote

Reg: 10.03.2007
Beiträge: 666
baserider befindet sich auf einem aufstrebenden Ast
Standard Browsercache HTML-Dateien

Hi,

per PHP und mod_rewrite werden dynamisch HTML-Dateien generiert bzw. gibt es auch ein paar statische HTML-Dateien.
In alle Dateien habe ich ein Javascript eingebunden, was aber (bei mir in Chrome) erst wirksam wurde, nach dem ich den Cache geleert hatte. DEr normale User soll ja nicht erst den Cache leeren. Gibt es da Möglichkeiten, wie ich das kontrollieren kann?

Die einzelnen CSS-Dateien z.B. sind schon mit einer Art Versionsnummer eingebunden, damit nach jeder Änderung immer die aktuelle Datei geladen wird.
baserider ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 04.09.2011, 17:30:06   #2 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Du kannst via HTTP-Header kontrollieren, ob etwas gecacht wird oder nicht.
Siehe RFC2616.
theHacker ist gerade online   Mit Zitat antworten
Alt 04.09.2011, 17:38:30   #3 (permalink)
Erfahrener Benutzer

ID: 174417
Lose-Remote

Reg: 10.03.2007
Beiträge: 666
baserider befindet sich auf einem aufstrebenden Ast
Standard

Hi,

damit kann ich dann generell für jeden user den cache ein bzw. ausschalten oder? Gut wäre ja, wenn der User die Seite gesehen hat, und dann wird der Cache aktiv. So ähnlich wie bei der Versionierung der einzubundenden Dateien.
baserider ist offline Threadstarter   Mit Zitat antworten
Alt 04.09.2011, 18:20:47   #4 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Zitat:
Zitat von baserider Beitrag anzeigen
damit kann ich dann generell für jeden user den cache ein bzw. ausschalten oder?
Nö.
Du kannst dem User-Agent nur sagen, ob die angeforderte Resource gecacht werden darf oder nicht. Kein User-Agent auf der Welt erlaubt dir, seine Einstellungen (so er überhaupt welche besitzt) zu verändern.
Zitat:
Zitat von baserider Beitrag anzeigen
Gut wäre ja, wenn der User die Seite gesehen hat, und dann wird der Cache aktiv.
Ein User-Agent kann wohl nix cachen, was er nicht mindestens einmal abgerufen hat, oder was meinst du?
theHacker ist gerade online   Mit Zitat antworten
Alt 04.09.2011, 18:26:46   #5 (permalink)
Erfahrener Benutzer

ID: 174417
Lose-Remote

Reg: 10.03.2007
Beiträge: 666
baserider befindet sich auf einem aufstrebenden Ast
Standard

hmm.. ich erklärs mal an nem beispiel:

ich habe in einer externen Javascript-Datei eine neue Funktion eingefügt. Die Funktion rufe ich auf der Seite auf. Leider wird sie nicht ausgeführt, ausser ich lösche den Cache. Die js-Datei ist hinten mit einem Parameter versehen, aber ich denke der Browser holt die alte Seite (ohne eingefügte JS-Funktion). Das würde ich gern ändern
baserider ist offline Threadstarter   Mit Zitat antworten
Alt 04.09.2011, 19:15:30   #6 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Du kannst jedenfalls nicht beeinflussen, ob ein Browser überhaupt bei dir nachfragt, ob es eine veränderte Datei gibt. Theoretisch könnte ein Browser auch über Jahre mit eine einmal geladene Datei für seinen Benutzer anzeigen, ohne jemals wieder bei dir nachzufragen.

Einzige Stellschraube ist die Headermanipulation, um ein Ablaufdatum in nicht allzu weiter Zukunft zu legen (z.B. 1 Woche oder auch mal 1 Tag). Je kürzer die Zeit ist, desto mehr wird das Cacheprinzip natürlich torpediert und die Netzwerklast würde steigen. Aber das ist für die Browser ja eh kein Zwang, die können z.B. ohnehin sagen, dass sie frühestens nach einer Woche wieder nachfragen, selbst wenn von dir eine kürzere Zeit gefordert wird.

So ganz bin ich bisher aber auch noch nicht durchgestiegen, wann Browser eine neue Netzwerkanfrage ausführen. Trotz identischer Headerdaten bezüglich Lebenszeit werden bei meinem Firebug manchmal trotzdem Anfragen angezeigt, wo eigentlich (noch) gar keine sein sollten und auch bei einem Hardrefresh manchmal keine, wo eigentlich was sein sollte.

Wichtig ist letztlich nur, dass zusammenhängende Dateien, also CSS, JS oder Bilder in Verbindung mit ihrer jeweiligen HTML/PHP-Datei dem gleichen Stand entsprechen. Und dafür gibt es effektiv nur eineinhalb Möglichkeiten. Entweder anghängte Parameter oder "neue" Dateinamen. Aber beides ist nicht ganz ideal. Ersteres mag z.B. auch PageSpeed nicht. UNd zweiteres weil dann theoretisch beim Browser mit der Zeit viele alte Dateistände angesammelt werden, die eigentlich nur ersetzt werden müssten (was natürlich nicht geschieht, wenn die Dateinamen voneinander abweichen).

Ich nehme aber folgende Lösung: Anfragen an CSS, JS und Bilder werden per htaccess auf eine zentrale php geleitet (eine zweite neben der eigentlichen Seitenanfrage "index.php"). CSS und JS werden noch aus verschiedenen Unterordnern zusammengebastelt und komprimiert (Kommentare und Leerzeilen löschen etc.). Die Ergebnisse werden auf dem Server auch noch mal zwischengespeichert, damit diese Berechnungen nur bei Datumsänderung der Quelldateien neu durchgeführt werden müssen - genau wie das HTML-Ergebnis der anderen Datei, das sich nur bei Änderungen am Template oder der Daten in der Datenbank ändert. In der Regel werden also diese gecachten Dateien ausgeliefert.

Und dabei kann eben auch leicht das Prinzip für abweichende Dateinamen eingearbeitet werden, da diese Schnittstelle einfach Namensbestandteile ignorieren kann. So könnte sowohl bei template_11111.css als auch bei template_22222.css auf die immer gleich lautende Datei template.css zugegriffen werden. Ob das nun fortlaufende Zahlen sind oder z.B. ein Hash des Änderungsdatums oder sonstewas ist ja völlig egal. Aber nur dann kann man sich sicher sein, dass eine neue html-Ausgabe, die eine neue js oder css-Version benötigt auch die Anfrage auf eben jene geänderte js/css auslöst.

Aber wie gesagt: Ideal ist eigentlich alles nicht. Irgendwelche Kompromisse gibt es bei sowas immer.


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Alt 04.09.2011, 19:17:13   #7 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Zitat:
Zitat von baserider Beitrag anzeigen
Die js-Datei ist hinten mit einem Parameter versehen, aber ich denke der Browser holt die alte Seite (ohne eingefügte JS-Funktion).
Mit diesem Trick kann der Browser gar nicht mehr cachen. Obige Posts bezogen sich darauf, dass sich eine Resource ändert, während die URL gleichbleibt. Ändert sich die URL, so kann der User-Agent gar nichts aus dem Cache laden, weil für ihn die Resource völlig unbekannt ist.

http://example.com/foo.js?v=1 ist eine völlig andere Resource wie http://example.com/foo.js?v=2.

Guck dir nur mal das Forum hier an: Stell dir vor, ein Browser würde h**p://www.klamm.de/forum/showthread.php?t=42 cachen und beim Aufruf von h**p://www.klamm.de/forum/showthread.php?t=4711 den falschen Thread zeigen. Undenkbar

Was du also hast, ist eine Browser-Fehlfunktion. Da kannst du als Webprogrammierer nix dagegen machen. Maximal kann sich der User zur Not behelfen, indem er ungültige Cacheeinträge löscht oder mit einer Neuinstallation den Browser "bereinigt".
Was is das denn für ein komischer Browser, der sich da so verhält?
theHacker ist gerade online   Mit Zitat antworten
Alt 04.09.2011, 20:47:34   #8 (permalink)
Erfahrener Benutzer

ID: 174417
Lose-Remote

Reg: 10.03.2007
Beiträge: 666
baserider befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von theHacker Beitrag anzeigen
Mit diesem Trick kann der Browser gar nicht mehr cachen. Obige Posts bezogen sich darauf, dass sich eine Resource ändert, während die URL gleichbleibt. Ändert sich die URL, so kann der User-Agent gar nichts aus dem Cache laden, weil für ihn die Resource völlig unbekannt ist.
Genau, so will ich es auch, aber in diesem Fall ist es ja die eingebundene Javascript-Datei (oder eben CSS). Ich meinte dann den Aufruf der jeweiligen HTML-Datei, in der diese Dateien eingebunden sind.

Manipulation per header hatte ich auch gesehen, aber das soll ja auch nicht so zuverlässig sein:

header("Cache-Control: max-age=3600, must-revalidate");

Also mir ist es im Firefox und Chrome aufgefallen. Erst wenn ich ein par mal aktualisiert habe geht es dann.
baserider ist offline Threadstarter   Mit Zitat antworten
Alt 04.09.2011, 21:07:48   #9 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Zitat:
Zitat von baserider Beitrag anzeigen
Genau, so will ich es auch, aber in diesem Fall ist es ja die eingebundene Javascript-Datei (oder eben CSS). Ich meinte dann den Aufruf der jeweiligen HTML-Datei, in der diese Dateien eingebunden sind.
Jetzt blick ich nimmer durch.

In Post #1 sagst du, die JS-Datei wird gecacht. Jetzt isses die Datei, die die JS-Datei einbindet? Was nun?

Caching der JS/CSS-Datei verhinderst du mit einem Parameter (ggf. +HTTP-Header).
Caching der HTML-Datei verhindert du nur mit HTTP-Header (theoretisch kannst du auch Parameter verwenden, aber das wird hässlich).

HTTP-Header hast du Cache-Control, Last-Modified/If-Modified-Since(im Request), Expires, E-Tag/If-None-Match(im Request), die dir helfen können.
theHacker ist gerade online   Mit Zitat antworten
Alt 04.09.2011, 21:15:58   #10 (permalink)
Erfahrener Benutzer

ID: 174417
Lose-Remote

Reg: 10.03.2007
Beiträge: 666
baserider befindet sich auf einem aufstrebenden Ast
Standard

Ich rede die ganze Zeit von ner HTML Datei und das mit den eingebundenen Ressourcen war nur ne Zusatzinfo, wie ich es eben bei eingebundenen Dateien mit dem Cache mache. Das geht aber nicht für die aufgerufenen Dateien, in welcher diese Ressourcen eingebunden sind. (ok, man könnte das mit unterchiedlichen Dateinamen machen, aber das ist keine option für mich)

Mittels header und Cache-Control hatte ich ja vorhin auch geschrieben, aber da hieß es ja in einem Post weiter oben, das es auch nicht so zuverlässig ist, was ich ebenfalls auch im Netz lesen konnte.
baserider ist offline Threadstarter   Mit Zitat antworten
Alt 04.09.2011, 21:53:34   #11 (permalink)
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose-Remote

Reg: 20.04.2006
Beiträge: 2.259
tleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehen
Standard

Die einfachste (und nervenschonendste) Variante ist die Versionierung, die Du ja scheinbar auch schon bei den CSS-Dateien verwendest. Nenn die Datei doch bspw. script-v1.js und zähl das bei jeder einzelnen Änderung hoch.

Kann man auch dynamisch per mod_rewrite anpassen (versionsweise cachen, wenn Version X noch nicht vorhanden, erzeugen und abspeichern). Die jeweiligen Versionen kannst Du dann auch mit entsprechenden Expires-Headern versehen, dass sie lange im Cache liegen bleiben. Durch die Änderung des Dateinamens sollte sichergestellt sein, dass der Client immer die aktuellste Version erhält...

[edit]

Grad erst bewusst gelesen, dass die Version mit der Dateinamensänderung für Dich nicht in Frage kommt. Gibt's dafür 'nen Grund? Immerhin machst Du's doch scheinbar bei den CSS-Dateien auch?
.lange tage und angenehme nächte, tlx
:.whatthemovie.com (Screenshots raten) | PHP ExportForce-Klasse
tleilax ist offline   Mit Zitat antworten
Alt 04.09.2011, 21:55:42   #12 (permalink)
bekämpft die Mächte des Bösen
Benutzerbild von theHacker

ID: 69505
Lose-Remote

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über AIM schicken theHacker eine Nachricht über MSN schicken theHacker eine Nachricht über Yahoo! schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 20.468
theHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes AnsehentheHacker genießt hohes Ansehen
Standard

Zitat:
Zitat von baserider Beitrag anzeigen
Mittels header und Cache-Control hatte ich ja vorhin auch geschrieben, aber da hieß es ja in einem Post weiter oben, das es auch nicht so zuverlässig ist, was ich ebenfalls auch im Netz lesen konnte.
Zuverlässig is nix zu 100%. Es ist schließlich das Programm des Benutzers, was die Webseiten downlädt, rendert und anzeigt. Wenn jemand seinen User-Agent manipuliert, dass er sich nicht an die Protokolle und Standards hält, dann hast du als Webprogrammierer einfach Pech gehabt.
theHacker ist gerade online   Mit Zitat antworten
Alt 08.09.2011, 18:17:41   #13 (permalink)
Grammaton-Cleric

ID: 139235
Lose-Remote

Reg: 27.04.2006
Beiträge: 139
Maniac99 ist ein sehr geschätzter MenschManiac99 ist ein sehr geschätzter MenschManiac99 ist ein sehr geschätzter Mensch
Standard

Das der Browser .css und .js - Dateien cached ist gut! Das soll er auch machen!

Wie schon von thehacker beschrieben: wenn du einen nichtsnutzigen Parameter dranhängst, sollte der Browser von sich aus die Resource neu laden
.../script.js?v=1
.../script.js?v=2.
Ansonsten würde ich sagen: ist doch egal! Nach ein paar Seitenaufrufen, läd der Browser sowieso die Resourcen-Dateien noch ein mal neu.
Jeden Montag eine neue Köstlichkeit http://www.burning-chef.de
Maniac99 ist offline   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
html dateien im cgi-bin ausführbar Drogenfahnder Scripts & Software 3 14.03.2009 08:58:35
[html] Temponäre Dateien djjlx Programmierung 13 19.08.2008 18:05:35
[PHP] Funktion um Gif-Dateien in JPEG-Dateien zu konvertieren Papenburger Programmierung 3 24.01.2008 11:08:59
HTML-Datein per Script zu PDF-Dateien konvertieren Papenburger Programmierung 4 18.12.2007 22:46:01
Symbol bei HTM/HTML Dateien verschwunden sam940 Software/Windows 8 24.09.2006 12:30:47


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00:34 Uhr.