Volání Callbacku při expiraci Cache

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

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)

Majkl578
Moderator | 1364
+
0
-

Hm, nestačí to zahrnout do procesu vytvoření dat (callbackem)?

Vyki
Člen | 388
+
0
-

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
+
0
-

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.

blacksun
Člen | 177
+
0
-

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?

Vyki
Člen | 388
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.