Volání Callbacku při expiraci Cache
- Vyki
- Člen | 388
Napadlo mě, že pokud by při vytváření cache šel nastavit CALLBACK, který se zavolá když cache vyexpiruje, dalo by se to použít třeba k promazání temp. souborů, které jsou s hodnotou v cache nějak svázány. Dneska je možné cache CALLBACKEM invalidovat, ale volat CALLBACK až po invalidaci (asi) nejde. Bylo by super něco takového:
<?php
$cache->save('TempNews', 'Testovaci novinka', array(
Cache::EXPIRE => '+ 20 minutes',
Cache::ON_EXPIRE => callback($this, 'cleanFiles')->invokeArgs(array('tpath'=>'/temp/news/'));
));
?>
a v příslušném storage metody clean
ten callback
zavolat.
V obslužné funkci např. pro mazání dočasného souboru:
<?php
class News
{
public function cleanFiles($tpath)
{
@rmdir('/temp/news/'.tpath);
}
}
?>
Editoval Vyki (27. 7. 2010 22:17)
- Vyki
- Člen | 388
Majkl578 napsal(a):
Hm, nestačí to zahrnout do procesu vytvoření dat (callbackem)?
Když tvořím novou cache tak už nemám páru o tom jak vypadala ta předchozí. Když budu mít příklad:
- přidávání novinek s možností uploadu souborů
- přidám text novinky + nahraju nějaké soubory
- uložím to na pár hodin jako koncept do cache
- když těch pár hodin uplyne tak se ta cache invaliduje
- potřebuji aby se smazal nejenom jeden soubor v namespacu (adresáři) „news“, ale aby se zavolal callback, který se postará o to, že se smažou i soubory s tou položkou v cache svázané
Jak mám tohle zajistit při procesu vytvoření dat callbackem? To bych si musel napsat něco co v tu chvíli projede celý cache namespace „news“ a adresář „temp“ smaže ty soubory, o kterých není záznam. To se mi zdá jednoduší zavolat jednoduše callback, který po sobě zamete.
Editoval Vyki (28. 7. 2010 9:19)
- Majkl578
- Moderator | 1364
Vyki napsal(a):
Jak mám tohle zajistit při procesu vytvoření dat callbackem? To bych si musel napsat něco co v tu chvíli projede celý cache namespace „news“ a adresář „temp“ smaže ty soubory, o kterých není záznam. To se mi zdá jednoduší zavolat jednoduše callback, který po sobě zamete.
Proč? To je takový problém přidat jeden řádek:
unset($cache['key'])
? Na invalidaci závislostí jsou tu tagy.
- Vyki
- Člen | 388
Majkl578 napsal(a):
Proč? To je takový problém přidat jeden řádek:unset($cache['key'])
? Na invalidaci závislostí jsou tu tagy.
Já ty přílohy, ale nemám v cache. Kdyby byly v cache tak to můžu invalidovat tagem. Cpát, ale soubory do cache je zbytečné když je mám někde v temp. adr. Ty soubory jsou pouze závislé na jedné položce v cache.
- Vyki
- Člen | 388
blacksun napsal(a):
A když nemám právě ten ‚key‘? Jak (spíš kdy) se v cache mažou položky, které vypršely? Musí se volat právě nějaká metoda cache::clean a nebo je v tom nějaká magie?
O invalidaci položek v cache se stará garbage collector. Maže je automaticky podle meta flagů. Pokud zjistí, že položka na základě nějakého z těch flagů vyexpirovala, jednoduše jí smaže.
Editoval Vyki (28. 7. 2010 15:44)
- pesu
- Člen | 7
Mám úplně ten samý problém … v cache mám pod různými klíči uloženy názvy souborů, ale se stejným tagem. Jakmile takto otagované položky cache expirují, tak potřebuju zajistit, aby se ty soubory (jejichž jména jsou v cache) také fyzicky odstranily z disku. Bez callbacku nemám šanci tohle zajistit, protože v okamžiku kdy cache expiruje, tak já už se nikdy nedostanu k položkám a hodnotám (názvům souborů), které v ní byly uloženy.
- David Grudl
- Nette Core | 8218
Implementovat by to šlo, problém vidím v tom, že často se cache maže i mimo framework (smazání souborů, smazání databáze, vymazání memcache při restartu). Takže by to nebylo zcela spolehlivé. Otázka je, jestli mít nespolehlivé řešení, nebo raději žádné a věci řešit jinými způsoby.
- Vyki
- Člen | 388
Osobně to používám v omezení balastu, který by zbyl po nahrání
souborů na server. Tím myslím, že při uploadu to někdo nahraje, uloží si
novinku jako koncept, ten za 2 dny vyprší, tak mi přijde logické aby po
sobě zametl i soubory, které k němu patří. Vyřešil jsem to tak, že
jsem si upravil původní FileStorage tak, že při invalidaci cache se zavolá
fce z meta flagu MyFileStorage::ON_EXPIRE
a jako argumet se jí
předá obsah cache, kterou mažu. Nepřišel jsem na to jak to vyřešit
snáze. Bylo by super kdyby se to v nějaké podobě v Nette objevilo.