Back to Question Center
0

Semalt: vale la pena cambiare la mia intera struttura del file delle immagini utente per sfruttare il semplice caching del browser?

1 answers:

Su uno dei miei siti mobili, semplicemente memorizzo le immagini del profilo dell'utente come '1. jpg 'nella loro cartella utente, e passano progressivamente da lì per ulteriori immagini che caricano. Ciò significa che ogni volta che cambiano la foto del profilo, ad esempio, il nome del file rimane lo stesso.

Volevo sfruttare la memorizzazione nella cache delle immagini in modo che la stessa vecchia immagine non venisse scaricata più e più volte ogni volta che il profilo di un utente viene visualizzato e rivisto, ma allo stesso tempo, voglio che i miei utenti 'browser per scaricare il nuovo se è cambiato - applying for a barbados passport.

Da quello che ho letto, sembra che l'unico modo per farlo veramente sia usare effettivamente nomi di file casuali e tenere traccia di tutti quei nomi di file nel DB, in modo da poter impostare una cache senza scadenza , mentre le foto modificate di recente vengono nuovamente richiamate poiché hanno un nuovo nome di file. La bellezza del modo in cui li ho strutturati finora, tuttavia, è che posso saltare completamente il database e accedere direttamente ai file poiché la loro posizione è prevedibile.

Quindi la mia domanda è, ne vale la pena per me di cambiare l'intera struttura del file del mio sito, oltre a aggiungere l'elemento DB, a vantaggio della memorizzazione nella cache eterna e del nuovo download automatico al nuovo caricamento?

Questa è un'impresa enorme, ma se è ritenuta meritevole, non ho alcun problema ad andare avanti con questo drastico cambiamento. Voglio solo assicurarmi che sia così che i "ragazzi grandi" lo fanno in modo che non debba mai più cambiare la struttura dei file.

Grazie.

February 12, 2018

Una soluzione comunemente usata è quella di rendere gli URL delle immagini simili a questo:

  http: // www. esempio. com / path / to / immagini / 1. jpg? v = 123456 

Qui, / percorso / a / immagini / 1. jpg è il percorso URL effettivo dell'immagine, mentre ? v = 123456 è solo una query fittizia fissata sulla fine dell'URL. La stringa di query può essere qualsiasi cosa: un numero di versione, un timestamp, un hash del contenuto dell'immagine, a patto di cambiarlo ogni volta che l'immagine cambia e mantenerlo lo stesso quando non lo fa.

Il trucco è che il server web, quando viene richiesto di servire tale URL, ignorerà la stringa di query, poiché l'URL in effetti punta a un file statico. Ma per il browser dell'utente (e per eventuali proxy in mezzo), gli URL con stringhe di query diverse saranno completamente diversi e quindi qualsiasi modifica alla stringa di query impone al browser di ricaricare il file.

Quindi, puoi configurare il tuo server web per inviare intestazioni HTTP Expires e Cache-Control HTTP per consentire il caching indefinito, con la certezza che puoi forzare una ricarica cambiando il stringa della domanda. Un modo per farlo, se usi Apache con mod_expires , è mettere un . htaccess file nella directory delle immagini con le linee:

  ExpiresActive On
ExpiresDefault "access plus 1 year" 

Questa tecnica è utilizzata da molti siti Web popolari. Ad esempio, se guardi il sorgente HTML di questa stessa pagina, troverai che il foglio di stile per esso è caricato da un URL come questo:

  http: // cdn. sstatic. net / StackOverflow / all. css? v = 7cd8ea9d6f1e 

Qui, il ? V = 7cd8ea9d6f1e è una stringa di query fittizia proprio come ho descritto sopra; puoi confermarlo cambiando e vedendo che in effetti restituisce ancora lo stesso file.

C'è più di un modo per memorizzare nella cache.

GET condizionale

Se stai memorizzando queste immagini sul file system e servendole direttamente attraverso il server web, probabilmente stai già usando get condizionale . Il server Web utilizzerà automaticamente i metadati del filesystem per impostare un'intestazione ETAG e risponderà automaticamente con "304 Not Modified" se il browser include Se intestazioni If-Modified-Since o If-Matches nella sua richiesta. (Tutti i browser lo faranno. )

In questo caso l'intera immagine non viene restituita, quindi è possibile risparmiare sulla larghezza di banda. Tuttavia, verrà comunque emessa una richiesta GET, quindi avrai ancora il sovraccarico e la latenza di una richiesta.

Puoi ridurre leggermente il numero di richieste a scapito della freschezza della cache impostando le intestazioni del tuo server web Cache-Control con un valore pubblico, max-age = N per il tuo immagini. Questo dice che le cache possono mantenere la risorsa al massimo max-age secondi prima che debbano controllare se è stata aggiornata.

Tuttavia, HTTP definisce solo un modo per invalidare una voce della cache, che potrebbe non adattarsi alla semantica della tua applicazione: se POST o PUT in un URL che aggiorna la foto del profilo, rispondi con una Posizione: [url di foto ] intestazione e la voce cache per quell'URL sarà invalidata.

(Questo è il meccanismo che consente di memorizzare nella cache una pagina Web con commenti e quindi di ricaricare forzatamente la pagina dal browser dopo che l'utente ha pubblicato un nuovo commento. Il browser risponderà a POST / comment con 303 Vedi Altro e a Posizione: / pagina / con / commento . Nota che questo non funzionava in Firefox a causa di un bug persistente . )

A meno che tu non abbia molto traffico, questo approccio al caching va bene.

Modifica degli URL

Un url è una rappresentazione di una risorsa, quindi un altro modo per gestire la memorizzazione nella cache non è quello di modificare i parametri della cache per la risorsa, ma di creare una nuova risorsa con una direttiva "cache forever". Questo è l'approccio che i "grandi ragazzi" preferiscono, perché consente loro di generare no richieste extra, risparmiando loro molta banda. Il rovescio della medaglia è che richiede molto più contabilità aggiuntiva.

Ci sono due tecniche generali per questo.

Stringhe di query

I server Web ignorano le stringhe di query quando servono un file dal file system. Caches, tuttavia, non: / 1. jpg? t = 12345 e / 1. jpg? t = 67890 sono due risorse completamente diverse, non correlate, anche se il server pensa di essere uguali.

Quindi una cosa facile che puoi fare è aggiungere il timestamp del filesystem come stringa di query ogni volta che fai un riferimento a una risorsa nel tuo html, e imposta un'intestazione lunga Expires . Il browser memorizzerà quindi nella cache questa risorsa per sempre e non eseguirà alcun GET a condizione che la stringa di query non cambi.

Uno svantaggio è che è difficile o impossibile istruire il server web del nuovo url per un elemento se si desidera forzare la cache di una cache. Ad esempio, se un browser ha una pagina HTML nella cache con un / 1. jpg? v = 1 riferimento, ma è successo per cancellare la voce per / 1. jpg? v = 1 (forse ha esaurito il file o lo spazio di memoria), farà una nuova richiesta a / 1. jpg? v = 1 . Se nel frattempo l'immagine è cambiata in / 1. jpg? v = 2 , la risposta corretta è:

  1. Serve la vecchia versione del file. Lo faresti se volessi che tutte le risorse siano coerenti l'una con l'altra come lo erano ad un certo punto nel tempo. Questo è quello che dovresti fare con i file CSS, ad esempio, poiché un nuovo file css con un vecchio file html potrebbe non funzionare correttamente!
  2. Reindirizza alla nuova versione del file usando 301 Spostati permanentemente .

    Nomi dei file

    Invece di aggiungere una stringa di query, si modifica il nome del file.

leggi su http status 304 Not Modified , dovresti essere in grado di rispondere a una richiesta di download con 304, e con ciò dire al server di usare i dati memorizzati nella cache, di inviarlo nuovamente al browser. e leggi questa domanda https: // StackOverflow. it / questions / 2978496 / make-php-page-return-304-not-modified-if-it-hasnt-been-modified