Andreas Korthaus: / (JAVASCRIPT): Caching-Probleme (bei auto-refresh, server-push simulieren)

Beitrag lesen

Hallo!

Ich bin heute auf folgenden Artikel gestoßen: http://codewalkers.com/tutorials/87/1.html

Der Artikel beschreibt, wie man mit Hilfe von etwas PHP und Javascript eine HTML-Seite neu laden kann, und zwar direkt sobald sich was an irgendwelchen Daten ändert. Hierbei wird in einer JS-Schleife alle paar Sekunden ein Request an ein PHP-Script durchgeführt (und zwar so wie ein Bild per JS [vor-]geladen wird). Ein PHP-Script nimmt den Request entgegen, prüft die Daten und wenn sich was an den Daten geändert hat, verändert es einen Cookie und belegt diesen mit dem Timestamp der Änderung.

Die Idee finde ich ganz interessant, weil ich auch sowas in der Art benötige. Ich weiß dass dies nicht überall sinnvoll ist, wenn man aber einen "geschlossenen Anwenderkreis" hat kann man IMO solche Sachen mal machen, wenn es denn einen Zusatznutzen bringt.

Ich habe das Beispiel noch etwas vereinfacht um mal ein bisschen zu Testen wie das am besten mit verschiedenen Browsern funktioniert, und auch wie es möglichst wenig Resourcen verbraucht. Prinzipiell würde ich gerne vermeiden dass der Prüf-Request von einem PHP-Script bearbeitet werden muss, da dies extrem viele Resourcen verbraucht. Aber dieses Problem zu lösen hebe ich mir für später auf, da ich hierbei drauf achten muss dass die User authentifiziert sind (ohne HTTP-Auth), entsprechende Rechte haben ...

Zum Testen:

Man öffnet zunächst die HTML-Seite, von mir aus in mehreren Browsern / Browserfenstern gleichzeitig, und irgendwann öffnet man (am besten in noch einem anderen Fenster) das PHP-Script um Daten zu verändern, und wenige Sekunden später sollten sich alle zuvor geöffneten Browserfenster aktualisieren.

HTML-Seite (die im Hintergrund prüft ob sich was an den Daten geändert hat)

PHP-Script um Daten zu verändern (das Script ändert eine Datei, die von dem anderen Script überwacht wird)

PHP-Script um Daten auf Veränderungen zu prüfen (das Script prüft ob die entsprechende  Datei geändert wurde und vergleicht den timestamp mit dem empfangenen Cookie (aus dem JS Bild-Request). Wenn sich nichts geändert hat sendet es einen 204-Header, sonst einen 200-Header mit neuem Cookie und ohne Content. Das Script wird "als Bild" aus dem Javascript in der
HTML-Seite aufgerufen)

Den PHP-Quelltext kann man über "?source=1" einzusehen.

Ich habe jetzt verschiedene Probleme. Das größte davon ist, dass ich nicht mit IE 5 und IE 4 testen kann, da ich diese bei mir nicht mit Cookie-Unterstützung neben meinen IE6 installieren kann. Wenn also jemand einen der beiden Browser hat, wäre ich dankbar für eine kurze Rückmeldung ob es geklappt hat ;-)
(Oder wenn jemand weiß wie ich einen IE4/5 mit Cookie-Unterstützung neben IE6 installieren kann wäre das natürlich noch besser!)

Für Netscape4 musste ich bereits eine Sonderbehandlung einbauen. Entweder ich sende diesem tatsächlich bei _jedem_ Request eine Grafik inkl. aggressiver Anti-Caching Header als Antwort, oder ich muss den Request jedesmal etwas ändern. Das habe ich jetzt gemacht, indem ich noch einen Parameter anhänge, das heißt Netscape4 macht immer:
GET /detector.php?i=1
GET /detector.php?i=2
...

  
  img = new Image;  
  // NN4 Probleme  
  if(document.ids) {  
   img.src = 'detector.php?i='+ i++;  
  }  
  else {  
   img.src = 'detector.php';  
  }  

Allerdings habe ich hierbei auch nicht das beste Gefühl, nicht dass mir hier irgendein Cache oder sowas volläuft?

Wie ist das denn mit Javascript, wenn ich einem Image-Objekt("img = new Image;") eine Resource zuweise ("img.src = 'detector.php';"), die entweder Statuscode 200 und "content-type: text/html", oder Statuscode 204 zurückgibt? Es funktioniert in IE6, FF und NN4, also keine Sorgen drum machen? Lieber wäre mir gewesen ich könnte im ersten Request ein Bild schicken (1 pixel gif), und danach einen 304-Header, aber das habe ich bisher nicht hinbekommen. Irgendwie hören alle getesteten Browser nach einer 304-Antwort einfach auf mit den Requests. Das hat mit Sicherheit was mit dem lokalen Cache zu tun, aber trotz aggressivster Anti-Caching Header hat es nicht funktionieren wollen. Außerdem handele ich mit hierbei Probleme mit den Unterschieden im Caching-Verhalten ein. Ich bin mir auch nicht 100%ig Sicher ob es hier nicht noch Unterschied zw. JS und HTML gibt.

(Meine verzweifelten Versuche gehen aus den Kommentaren im Prüfscript hervor - wobei, wo ich da gerade drübergucke, habe ich doch wohl keine HTTP 1.1 Header mit HTTP/1.0 verwendet, oder? och nö...)

Oder hat vielleicht jemand von Euch ein gutes Rezept wie die entsprechenden Header aussehen müssen, so dass es in IE4+, NN4+, FF und neueren Operas funktioniert?

Was haltet Ihr prinzipiell davon?

Viele Grüße
Andreas

--
SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/