Back to Question Center
0

Semalat: Apa perlu kanggo ngganti kabeh struktur file gambar pangguna kanggo ngupayakake caching browser sing prasaja?

1 answers:

Ing salah sawijining situs mobile, aku mung nyimpen gambar profil pangguna minangka '1. jpg 'ing folder pangguna, lan entuk saka ngendi wae kanggo pics tambahan sing diunggahake. Iki tegese nalika ngganti foto profil, umpamane, jeneng file tetep padha.

Aku wis kepengin ngupayakake caching gambar supaya foto lawas sing padha ora bisa diundhuh kanthi manawa sawisé profil pangguna dianggep lan ditinjau, nanging ing wektu sing padha, aku pengin panggunaanku 'browser kanggo ngundhuh sing anyar yen wis diganti.

Saka aku wis maca, dadi mung cara kanggo nglakoni kanthi bener iki yaiku nggunakake jeneng file acak lan nglacak kabeh jeneng file kasebut ing DB, supaya sampeyan bisa nyetel cache sing ora kadaluwarsa , nalika foto sing anyar sing diganti bakal ditarik maneh amarga jenenge anyar. Kaendahan ing cara aku nggawe wong-wong mau disusun nganti saiki, nanging, aku bisa ngliwati basis data lan bisa ngakses file kasebut kanthi langsung amarga lokasine bisa ditebak.

Dadi pitakonanku, iku worth aku kanggo ngganti kabeh struktur file situs, nambah unsur DB, kanggo manfaat caching langgeng lan ngundhuh kanthi otomatis nalika upload anyar?

Iki minangka usaha ageng, nanging yen dianggep pantes, aku ora duwe masalah nerusake kanthi owah-owahan drastis iki. Aku mung pengin nggawe manawa iki minangka "bocah lanang" apa supaya aku ora perlu ngganti struktur file maneh.

Thanks.

February 12, 2018

Solusi sing umum dipigunakaké kanggo nggawe URL gambar katon kaya iki:

  http: // www. conto. com / path / to / images / 1. jpg? v = 123456 

Kene, / path / kanggo / images / 1. jpg yaiku path URL sing asline gambar, dene ? v = 123456 mung arupa tembung dummy sing dibandhingake ing pungkasan URL. Sengaja query apa wae - nomer versi, wektu tundha, hash saka isi gambar - anggere sampeyan ngganti saben gambar diganti, lan tetep padha nalika ora.

Cepet yaiku menawa server web, nalika dijaluk ngladeni URL kasebut, bakal nglirwakake string pitakonan, amarga URL kasebut nyatane menyang file statis. Nanging ing browser panganggo (lan kanggo proksi ing antarane), URL karo strings query beda bakal beda-beda, lan samubarang owah-owahan menyang string pitakonan bisa nampilake browser kanggo ngunggah maneh berkas.

Mangkono, sampeyan bisa ngatur server web kanggo ngirim Kadaluwarsa lan Cache-Control header HTTP kanggo ngidini caching ora jelas, aman ing kawruh sing bisa meksa tambahna kanthi ngganti query string. Siji cara kanggo nglakoni, yen sampeyan nggunakake Apache kanthi mod_expires , yaiku ngisi . htaccess ing direktori gambar karo garis:

  ExpiresActive On
ExpiresDefault "akses plus 1 taun" 

Teknik iki digunakake dening akeh situs web populer. Contone, yen sampeyan ndeleng sumber HTML saka kaca iki banget, sampeyan bakal nemokake yen lembaran gaya kasebut dimuat saka URL kaya iki:

  http: // cdn. sstatic. net / stackoverflow / kabeh. css? v = 7cd8ea9d6f1e 

Punika, ? V = 7cd8ea9d6f1e minangka string query dummy kaya sing dijelasake ing ndhuwur; sampeyan bisa ngonfirmasi yen kanthi ngganti lan ndeleng sing bener isih ngasilake file sing padha.

Ana luwih saka siji cara kanggo ngakses cache.

Conditional GET

Yen sampeyan nyimpen gambar kasebut ing sistem berkas lan nyawisake kanthi langsung liwat server web, sampeyan mungkin wis nggunakake getah sing kondisional . Server web kanthi otomatis bakal nggunakake metadata fileystem kanggo nyetel header ETAG, lan kanthi otomatis bakal mbales kanthi "304 Ora Modifikasi" yen browser kalebu If-Matches header ing panyuwunané. (Kabeh browser bakal. )

Ing kasus iki, kabèh gambar ora diturokake maneh, dadi sampeyan nduweni tabungan bandwidth. Nanging, panjaluk GET isih bakal ditanggepi, supaya sampeyan isih duwe overhead lan latency saka panyuwunan.

Sampeyan bisa ngurangi jumlah panjalukan rada kanthi ngirit kesegaran cache kanthi gadhah setting server web Cache-Control header karo public, max-age = N gambar. Iki nyatakake yen caches bisa nyimpen sumber kasebut ing paling max-age detik sadurunge kudu mriksa yen dianyari.

Nanging, HTTP mung nemtokake cara kanggo mbatalake entri cache, sing mboten cocok kaliyan semantika aplikasi: yen sampeyan ngirim utawa PUT menyang url sing nganyari foto profil, reply karo Lokasi: [url foto ] header lan entri cache kanggo url sing bakal invalidated.

(Iki minangka mekanisme sing ngidini sampeyan nggoleki kaca web karo komentar, banjur duwe kaca kanthi dimuat maneh dening browser sawise kiriman user komentar anyar. Browser bakal reply menyang POST / komentar karo 303 Waca Liyane lan Lokasi: / page / with / comment . Elinga yen iki ora digunakake kanggo nggarap Firefox amerga longstanding bug . )

Yen sampeyan ora duwe lalu lintas, pendekatan iki kanggo caching apik.

Ganti url

URL minangka perwakilan saka sumber, supaya cara liyane kanggo ngatur caching ora ngganti paramèter cache sumber, nanging kanggo nggawe sumber daya anyar kanthi "cache salawasé" direktif. Iki minangka pendekatan sing "gedhe lanang" sih, amarga ngidini wong ngasilake ora panjaluk tambahan, nyimpen akeh bandwidth. Kekurangan iku mbutuhake simpenan buku tambahan sing luwih akeh.

Ana rong teknik umum kanggo iki.

Strings query

Server web ora nglirwakake strings query nalika njabat file saka sistem berkas. Caches, Nanging, ora: / 1. jpg? t = 12345 lan / 1. jpg? t = 67890 iku rong sumber sing ora ana hubungane beda, sanajan server mikir yen padha.

Supaya siji gampang sampeyan bisa nyedhiyakake timestamp fileystem minangka string pitakonan nalika sampeyan nggawe referensi kanggo sumber daya ing html, lan ngeset long Kadaluwarsa header. Browser kasebut banjur bakal mbusak sumber daya iki selawase lan ora dilakoni apa wae GETs anggere string query ora ganti.

Kelemahane iku pancen angel utawa ora mungkin kanggo nglatih server web url anyar kanggo item yen sampeyan pengin nganggo paksa kanggo mbusak cache. Contone, yen browser nduweni kaca HTML sing katutup kanthi / 1. jpg? v = 1 referensi, nanging kedadeyan mbusak entri kasebut kanggo / 1. jpg? v = 1 (mungkin mlayu metu file utawa ruang memori), bakal nggawe panjalukan anyar menyang / 1. jpg? v = 1 . Yen ing wektu iki gambar wis diganti dadi / 1. jpg? v = 2 , respon sing tepat yaiku:

  1. Nawani versi lawas berkas. Sampeyan bakal nindakake iki yen sampeyan pengin kabeh sumber daya kanggo konsisten karo siji liyane minangka padha ing titik tartamtu ing wektu. Iki apa sing kudu dilakoni nganggo file CSS, contone, amarga file css anyar karo berkas html lawas ora bisa mlaku kanthi bener!
  2. Ngganti menyang versi anyar berkas nganggo 301 Dipindhah Saklawase . Sampeyan bakal nindakake iki yen sampeyan pengin kabeh sumber daya dadi anyar sabisa.

Loro-lorone iki angel dilakoni karo server web wae, sing tegese sampeyan kudu njaluk aplikasi web malah kanggo panjelasan gambar, sing bisa dadi luwih rumit lan luwih akeh sumber daya. Webservers yaiku banget cepet ing sajroning file, saengga aplikasi nduwur web bisa ngatasi bandwith lan gain latency.

Jeneng berkas

Tinimbang nambahake string pitakonan, sampeyan ngganti jeneng file. Iki tegese gampang kanggo njaga pirang-pirang versi file ing sistem berkas, nanging sampeyan mbokmenawa kudu nyimpen metadata file lan nggawe simpenan database liyane kanggo nglacak sumber lan jeneng.

. lan maca pitakonan iki https: // stackoverflow. com / questions / 2978496 / make-php-page-return-304-not-modified-if-it-hasnt been modified

Semalat: Apa perlu kanggo ngganti kabeh struktur file gambar pangguna kanggo ngupayakake caching browser sing prasaja?
Reply