Cache::clean – Jak smazat všechny data v určité namespace?
- Blizzy
- Člen | 149
$cache = Environment::getCache('namespace');
// uložení hodnot do cache
$cache['item1'] = 'data1';
$cache['item2'] = 'data2';
$cache['item3'] = 'data3';
// smazání všech položek
$cache->clean(array(
Cache::ALL => TRUE
));
// zjistím, jestli existují data
Debug::consoleDump($cache['item1']);
A data stále existují, nesmazala se. Kde dělám chybu? Jak můžu smazat všechny data v určité namespace?
- PetrP
- Člen | 587
Tvůj příklad by měl fungovat správně. Jinak clean není závislé na namespace. Vymazáva ze všech namespace. Takže abys vymazal jen určitý namespace, musel bys si ho např otagovat.
To co popisuješ bude asi bug který jsem teď objevil:
Neinvaluduje se cache. Když mám cacheBase nastaven jako prefix a né jako složku.
Dříve šlo třeba toto:
variable.cacheBase = %tmpDir%/cache
a cache se vytvářela jako ./cache_namespace%00klic
Takže když jsem to potřeboval vše do složky, musel jsem nastavit prefix
takto:
variable.cacheBase = %tmpDir%/cache/
Cache se nedávno změnila a dává namespace do podsložek, a cacheBase už není prefix, ale složka.
A ted k chybě:
Mám nastaveno
variable.cacheBase = %tmpDir%/cache/
A v FileStorage::clean() na tomto řádku mám
echo $entry;
// "/.../tmp/cache/c_namespace%00klic"
echo $base;
// "/.../tmp/cache//c""
//tedy
strncmp($entry, $base, strlen($base) === 1
A všechny soubory skoncí na continue;
Tedy než to david opraví tak je potřeba cacheBase nastavit bez lomitka na
konci variable.cacheBase = %tmpDir%/cache
- Blizzy
- Člen | 149
PetrP napsal(a):
Jinak clean není závislé na namespace. Vymazáva ze všech namespace. Takže abys vymazal jen určitý namespace, musel bys si ho např otagovat.
Tagování mi připadá v tomto případě zbytečné, když už mám data v určité namespace, což je samo o sobě logická skupina dat.
Podle mě byl dobrý nápad upravit clean tak, aby bylo možné mazat jen data v určité namespace, např. přidat podmínku CACHE::NAMESPACE. Pak by se mohlo postupovat takto:
$cache->clean(array(
Cache::NAMESPACE => $cache->namespace
));
- PetrP
- Člen | 587
Takže v první řadě přimomínam problém z starým /cache/
a novým /cache
o kterém píšu výše
A přidávám další:
$cache->clean(array(Cache::ALL=>true));
by mělo smazat vše ale na tomto
řádku při $all = true
poposkočí o 2 urovně. Tedy se vymazání
neprovede.
Mám problém s očima, nebo s mozkem? ;]
Jako opravu bych asi vyděl něco jako:
- if (!$meta || $all) continue 2;
+ if (!$meta) continue 2;
+ if ($all) break;
Edit: Toto je již fixnuto.
Editoval PetrP (2. 11. 2009 16:26)