Cache::clean – Jak smazat všechny data v určité namespace?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Blizzy
Člen | 149
+
0
-
		$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
+
0
-

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

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
));
Honza Kuchař
Člen | 1662
+
0
-

Taky jsem pro.

PetrP
Člen | 587
+
0
-

jo to je dobry nápad, zatim jsem to ale nikdy nepotřeboval :)

PetrP
Člen | 587
+
0
-

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)