Za určitých okolností nevyprší cache
- arron
- Člen | 464
Pokud uložím do cache nejaka data (s libovolně nastavenou expirací), a v zápětí je čtu bez toho, aby proběhla další operace s cache (zápis nebo čtení), tak data zůstanou v cache i po uplynutí času expirace. Jednoduchý test:
$cache->save('oneSecondData', array('second' => 1), 1);
sleep(2);
if(isset($cache['oneSecondData']) {
echo 'Expired data...';
}
Chyba je v tom, že třída Cache
si pamatuje poslední
použitý klíč (ať už čtený nebo zapisovaný), a pokud je dotazovaný
klíč stejný jako ten poslední použitý, tak se neprovádí žádné
kontroly a prostě se vrátí data.
Editoval arron (25. 4. 2011 15:09)
- kravčo
- Člen | 721
Toto je feature. Bez toho by klasické pracovanie s kešou bolo o niečo pomalšie a nebolo akože atomické:
if (!isset($cache[$key])) {
// ...
$cache->save(...);
}
// ! tu môže dôjsť k zneplatneniu keše
echo $cache[$key];
a teda by bolo treba používať pomocné premenné:
$data = $cache[$key];
if ($data === NULL) {
// ...
$data = $cache->save(...);
}
echo $data;
Ak ti to vyložene vadí, môžeš použiť volanie
$cache->release()
, ktoré internú keš keše vyprázdni.
- David Grudl
- Nette Core | 8228
Setkal jsem se s myšlenkou, že by si objekt $cache mohl pamatovat nejen poslední klíč, ale rovnou všechny. Co myslíte?
- Honza Marek
- Člen | 1664
Hm, já jsem předpokládal, že to tak je. Takže mi to pochopitelně přijde jako dobrý nápad.
- Patrik Votoček
- Člen | 2221
určitě! nebudu to muset „hackovat“! Pochopitelně na základě namespace (klíče pouze z danné namespace).
- RadekDvorak
- Člen | 11
David Grudl napsal(a):
Setkal jsem se s myšlenkou, že by si objekt $cache mohl pamatovat nejen poslední klíč, ale rovnou všechny. Co myslíte?
Leda by to šlo snadno vypnout či překonfigurovat. Používám i dlouho běžící cli skripty a bylo by zbytečné, aby po dnu běhu skript spadnul kvůli nedostatku paměti jen proto, že nabobtnala cache. Už jsem viděl, jak došla paměť kvůli seznamu sql dotazů :-(
Edit: autorství citace
Editoval RadekDvorak (9. 6. 2011 0:10)
- Filip Procházka
- Moderator | 4668
Aby se dalo invalidovat konkrétní namespace? Nebo vypsat někam celou cache? Třeba taková Doctrine vyloženě potřebuje seznam klíčů, jinak to odmíná smazat. Což asi není úplně ideální, ale je vidět, že se to opravdu hodí :)
- Filip Procházka
- Moderator | 4668
Klíče nejsou problém, stačilo by je ukládat třeba do FileJournalu, tj fuk. Problém by byl, kdyby se v paměti držela úplně celá cache celého namespace. To by nebylo dobré.