Globalne zneplatnenie cache

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jan.reges
Člen | 10
+
0
-

Zdravim.

Riesim jeden problem.. potrebujem zaistit, aby sa v ramci celeho projektu zneplatnila vsetka cache na zaklade zmeny nejakych suborov. Aktualne ide o subor /.svn/wc.db (tzn. aby sa vsetka cache znevalidnila napr. po svn-update) a subor „last-import-date.txt“, kde sa uklada datum a cas posledneho importu nejakych klientskych dat, ktorych zmena ma v podstate vplyv na takmer cely projekt.

Selektivne zneplatnenie cache na jednotlivych miestach je zbytocne pracne, bohate u tohoto projektu bude stacit, ak sa vsetky cache zneplatnia globalne, vyssie spominanym sposobom.

Napada vas, ako toto systemovo vyriesit?

Jednym z nekompletnych rieseni je extendnut MemcachedStorage a FileStorage a ich metody write() tak, aby do $dp (dependencies) injektli callbacky, ktore overia cas zmeny spominanych suborov (priamo tie storage dependency-type „FILES“ nepodporuju). Bohuzial, Nette na niektorych miestach pouziva hardcoded FileStorage a hardcoded instanciu Cache, takze nie vsade sa da vlastnu instanciu Storage injectnut.

Druhym riesenim, ktore ale Nette aktualne nepodporuje by bolo to, ze by si Nette instanciu classy „Cache“ nevytvaralo na X-miestach kodu pomocou „new Cache()“, ale nejakou factory, ktoru by sa dalo overridnut. V tomto pripade by som urobil vlastnu extenziu Cache a jej metody save() tak, aby do $dp injectla bud vyssie spominane callbacky, alebo priamo FILES, ktore instancia Cache podporuje (na rozdiel od konkretnych Storage).

PS: nez sa dopracujem k elegantnejsiemu rieseniu, urobil som si v bootstrape mini funkciu, ktora si posledne modifikacie spominanych suborov pamata a ak sa zmenili, premaze hned obsah /temp/cache/ (zatial pouzivam vsade len FileStorage).

Dakujem za akykolvek napad, postreh. Mozno som len nieco prehliadol? :)

jan.reges
Člen | 10
+
0
-

Naozaj nie je ziadny Nette guru, ktory by mi s tym vedel pomoct? :)

Nette by imho malo spristupnit/umoznit uzivatelovi zasiahnut do istych procesov – obzvlast pokial ide o ukladanie nejakych dat niekde na serveri.

Bol by som naozaj zato, aby Nette aj samotnu instanciu Cache (nie len CacheStorage) ziskavalo/vytvaralo cez nejaku factory, ktoru by mohl uzivatel redefinovat. Nikde v kodoch Nette by sa nemuselo objavit priamo „new Cache()“.

Pre mna by to napr. znamenalo to, ze by som mohol mat akukolvek Cache, ktoru Nette pouziva, pod 100%-tnou kontrolou. V pripade potreby by sa mohla evidovat statistika uspesnosti cache (hit rate, co je pri optimalizacii velmi dolezite) – vyuziti je ale omnoho viac, zalezi na konkretnom projekte.

Zapracovanie tejto upravy je pomerne jednoduche a defaultne chovanie by bolo bez problemov spatne kompatibilne. Bezny uzivatel by nic nepostrehol a uzivatel s vyssimi narokmi by nebol obmedzeny…

Filip Procházka
Moderator | 4668
+
0
-
$cacheStorage->clear(array(Nette\Caching\Cache::ALL => TRUE));
$templateCacheStorage->clear(array(Nette\Caching\Cache::ALL => TRUE));