2010-11-05 5 views
5

Sto usando uno script JavaScript che mi dice se nella cache del browser dell'utente sono memorizzati nella cache del browser dell'utente URL specifici dell'immagine. Lo sto utilizzando perché costruisco un array di immagini non memorizzate nella cache che verranno caricate separatamente, dopo aver eseguito un processo più importante. Questo script è stato scritto appositamente per Google Chrome, quindi non ho bisogno di una soluzione cross-browser.Come sapere se l'immagine viene estratta dalla cache Web dell'utente o come ottenere il tempo di caricamento esatto?

La mia funzione corrente controlla il tempo impiegato per caricare l'immagine e se è inferiore a qualche millisecondo (attualmente 25 ms), presumo che sia estratto dalla cache.

La differenza tra le immagini memorizzate nella cache e quelle non memorizzate nella cache è facile da individuare manualmente controllando il pannello Risorse nello strumento di sviluppo di Chrome. Quando passa il tempo di caricamento, Chrome indica se il file è stato estratto dalla cache o stampando un suggerimento simile al seguente: xx ms Latency, xx ms Download (from cache).

Ho notato che in alcune occasioni, il tempo di latenza è piuttosto lungo (ad esempio 64ms per solo 2ms di tempo di download) e rende inutile la mia funzione di rilevamento poiché il tempo di caricamento totale supera quindi la mia soglia. Aumentare la soglia non è possibile in quanto le immagini piccole e non memorizzate nella cache potrebbero anche essere caricate nello stesso intervallo di tempo.

Ora che hai avuto il mio problema, qui va la mia domanda:

-E 'possibile controllare in modo accurato al 100% (per esempio come il pannello di risorse di Chrome) il file viene dalla cache? (Credo che se quel pannello lo fa, ci deve essere un modo, ma non ho potuto trovare su Internet)

O

-È C'è un modo per separare i due ritardi (ad esempio latenza vs. Download) per poter controllare solo il tempo di download vero? Il calcolo del tempo trascorso tra l'avvio del caricamento dell'immagine e l'evento onload restituisce il tempo totale.


Vi ringrazio per aver letto la mia domanda e anche se non avete una soluzione precisa, pensieri, idee, sono i benvenuti!

(PS: io non sono un madrelingua inglese quindi per favore non la colpa a me per aver fatto errori!)

Gaël

+0

Per favore potresti condividere JavaScript? – Eldar

risposta

0

Ci scusiamo per confondere la vostra risposta.

ho fatto alcuni test e ha trovato i seguenti risultati: L'intestazione 304 not modified appaiono solo quando la risorsa è stantio e validato dal server tramite If-None-Match/If-Modified-Since. Quando la risorsa è ancora fresca e non richiede la convalida, il codice di stato restituito è 200 Ok.

Tuttavia, sembra che sia presente un'intestazione Age che indica che la risorsa è stata memorizzata nella cache. Quindi immagino di poter passare a PHP e fare qualcosa come if status code is 304 or Age header exists then resource is cached. Ma cosa succede se non c'è l'intestazione Cache-Control: max-age=xx? Esiste comunque un header Age non appena la risorsa viene memorizzata nella cache e fresca?

Esamineremo ulteriormente lunedì e lo terremo aggiornato qui.

+0

Per le persone che hanno lo stesso problema: 304 Non modificato è un modo efficace per capire se l'immagine è valida nella cache web dell'utente. Quando l'immagine è ancora fresca e non richiede la convalida, è possibile assumere che il file provenga dalla cache controllando se l'intestazione 'Age' esiste in una situazione 'Cache-Control: max-age' o se l'intestazione 'Date' è passato l'ora corrente in una situazione di "Scadenza". –

1

È necessario esaminare le intestazioni HTTP quando l'immagine viene servita fino a essere Sicuro al 100% Purtroppo JavaScript non ha accesso a questi dati.

Vedi: Accessing the web page's HTTP Headers in JavaScript

+0

Grazie per aver risposto :) Tuttavia, sto usando solo le immagini memorizzabili nella cache fino a quando l'utente lo ha visualizzato prima che venga pubblicato dalla cache. Quello che voglio separare sono le immagini che l'utente ha già visto e le immagini che non ha ancora visto. Diciamo che ho due immagini. Uno è nella cache del browser, l'altro no. Voglio essere in grado di distinguere questi due :) (Se hai detto quello che hai detto perché le intestazioni dicono se il file proviene dalla cache potresti essere più preciso su quale intestazione farlo per favore?) Grazie ancora :) –

+0

Se guardi il pannello Risorse di Chrome, impostato sulla modalità "dimensione", puoi fare clic su un'immagine, quindi sulla scheda INTESTAZIONI. Ottieni "200 ok" quando scarichi un'immagine, o ottieni un "304 non modificato" se è nella cache. JavaScript non può darti questa informazione. La tua tecnica timer è l'unico modo per farlo. A causa della latenza della rete, non è sempre possibile stabilire se l'ora visualizzata rappresenta "200" o "304". Puoi fare un'ipotesi istruita, ma non puoi dirlo con certezza. –

+0

Si consiglia di guardare CSS Sprites come metodo alternativo al problema. http://skyje.com/2010/02/css-sprites/ –