Newsgroup: it.comp.lang.javascript
Titolo: [quasiFAQ] Fregare la cache dei browser per un file che cambia velocemente

Lo so, è una domanda trita e ritrita, ma non ne sono uscito molto bene ancora.
All'interno di uno script Javascript (o forse un'applicazione Flash, non so bene 
ancora) devo scaricare un file remoto in continuazione (diciamo 1 volta al 
secondo) perchè i dati cambiano frequentemente.
Attualmente ho pensato di utilizzare il metodo XMLHttpRequest (vedete anche il 
post succesivo, please) che, mediante una GET HTTP, scarica il file.
Quello che succede, però, è che questo file viene memorizzato la prima volta 
nella cache del browser e quindi non viene più richiesto al server. L'unico modo 
con Firefox è cliccare su Aggiorna, con IE chiudere e riaprire il programma.
Ho letto in giro che questo problema è noto e che ci sono alcune soluzioni, ma 
nessuna mi convince completamente.
Posso aggiungere al nome del file da richiedere il suffisso "?rand=<numero 
casuale>" in modo da generare un nome sempre diverso ed obbligare il browser a 
scaricare il file. Effettivamente il meccanismo funziona, però la cache del 
browser si riempie di tanti file diversi. Siccome faccio la richiesta 1 volta al 
secondo e l'utente può rimanere collegato anche per ore... non mi sembra molto 
educato (o no?)
Ho anche letto che è possibile usare l'header HTTP "Expires: <data di 
scadenza>", anche se non ho capito bene come funziona. Dovrebbe essere così: si 
dice al browser che questa pagina scade il giorno x. Se x è proprio oggi, il 
browser dovrebbe richiederla al server.
Non ho provato, ma il mio dubbio è questo. Io non sto scaricando un file HTML ma 
un file di testo (forse un XML, non so ancora come fare), magari generato da uno 
script (ancora no, però)... quindi l'header non si può usare, vero? O mi 
sbaglio? Se si può usare, come faccio ad aggiungerlo nel mio file di testo sul 
server?
Esiste un modo migliore per risolvere il mio problema, quindi scaricando 
continuamente i nuovi dati dal server e senza inondare la cache del client?

 faccio ad aggiungerlo nel mio file di testo sul server?
Se la pagina č generata da uno script si puň comunque aggiungere l'header. 
Per esempio in PHP esiste una funziona apposita per inviare header HTTP.
Qualsiasi file venga richiesto ad un server HTTP questo viene inviato dal 
server al client con degli header, per esempio quelli che specificano che 
tipo di file č. Uno di questi (anzi, ne esistono tanti a dire il vero) 
riguarda proprio le date di scadenza della pagina, le date di ultima 
modifica, ecc. ecc. e lo scopo č proprio quello che dici tu.
Comunque se devo essere sincero, a me quel metodo non ha mai convinto 
tanto... mi sembra che a volte non funzioni e comunque venga caricata la 
vecchia pagina. Non so come mai
-- 
Elminster 

http://www-128.ibm.com/developerworks/xml/library/x-ajaxxml2/index.html#N102E5
Ciao ;)

 
http://www-128.ibm.com/developerworks/xml/library/x-ajaxxml2/index.html#N102E5
Sì, questa tecnica mi è già nota e l'ho anche citata nel mio primo post.
Aggiungere un numero random (oppure la data) per rendere l'URL sempre diverso ed 
obbligare, così, il browser a richiedere il file dal server.
Però la cosa brutta è che, facendo così, riempi la cache del client di tanti 
file vecchi. Nella mia applicazione, il file deve essere scaricato in 
continuazione (diciamo 1 volta al secondo) perchè i dati cambiano molto 
velocemente. Se la connessione dura un'ora, sono 3600 file scaricati e *tutti* 
conservati nella cache del browser.
Non mi sembra molto "educato"... o sbaglio?

 vecchia pagina. Non so come mai
Boh, però vorrei provare. Magari ti faccio sapere.
Sulla pagina XMLHttpRequesta di wikipedia in inglese c'è un altro metodo per 
fregare la cache dei browser:
---
var request = (typeof(XMLHttpRequest) != "undefined") ? new XMLHttpRequest() : 
new ActiveXObject("Msxml2.XMLHTTP");
  request.open("GET", uri, false);
  request.send(null);
  if(!request.getResponseHeader("Date"))
  {
    var cached = request;
    request = (typeof(XMLHttpRequest) != "undefined") ? new XMLHttpRequest() : 
new ActiveXObject("Msxml2.XMLHTTP");
    var ifModifiedSince = cached.getResponseHeader("Last-Modified");
    ifModifiedSince = (ifModifiedSince) ? ifModifiedSince : new Date(0); // 
January 1, 1970
    request.open("GET", uri, false);
    request.setRequestHeader("If-Modified-Since", ifModifiedSince);
    request.send(null);
    if(request.status == 304)
    {
      request = cached;
    }
  }
---
In pratica viene fatta una prima GET del file. Se il browser prende il file 
dalla sua cache (come normalmente accade) l'header Date manca. Quindi 
controllando l'assenza di questo header si è certi che il file è stato preso 
dalla cache (immagino che tutti i bravi server web aggiungono invece l'header Date).
Se così, viene *forzato* una GET dal server aggiungendo l'header 
If-Modified-Since. La data di questo header è uguale alla data di modifica del 
file (header Last-Modified della risposta al primo GET) oppure una data molto 
vecchia (1 Gennaio 1970). Se il server ci garantisce "in prima persona" che il 
file non è cambiato, allora si usa quello della cache, altrimenti si usa il 
nuovo file appena ricevuto direttamente dal server.
Non sembra male come metodo... che dite?

 Non sembra male come metodo... che dite?
provalo e facci sapere come va :P
Ciao, Giovanni
-- 
Vuoi guadagnare 5 Euro con eBay? Vai su 
http://freedom.netsons.org/
 ;-)
Vuoi chattare su un oggetto eBay? 
http://freedom.netsons.org/echat/
 :-)
Vuoi vedere solo i FB negativi? 
http://www.toolhaus.org/cgi-bin/negs
 :)

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Data passata
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  //
sempre modificato
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/
1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
Se viene utilizzato un header nella request
la pagina che la richiede che header avrà
(e non risolvi neppure la cosa mettendolo  in questa
ultima) ?
Non mi sembra proprio un metodo appropriato
per risolvere la cosa o sbaglio ?
Voglio dire la pagina richiedente non può ricavare
beneficio da una cosa del genere.
@pozz
Bel suggerimento mi studio un po la cosa
anche se  non l'ho mai visto adoperare
Ciao.