nefunguje mazani z memcache

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

mam jednoduchy priklad

	public function renderTestCacheA() {
		$cache = \Foo\Models\BaseModel::getCache(\Foo\Models\BaseModel::CACHE_MEM, 'xxx');
		$cache->save('xxx', date('c'));

		$this->template->msg = 'ulozeno';
	}

	public function renderTestCacheB() {
		$cache = \Foo\Models\BaseModel::getCache(\Foo\Models\BaseModel::CACHE_MEM, 'xxx');

		if (isset ($cache['xxx'])) {
			$this->template->msg = $cache['xxx'];
		} else {
			$this->template->msg = 'v cache nic neni';
		}

		$this->setView('testCacheA');
	}

	public function renderTestCacheC() {
		$cache = \Foo\Models\BaseModel::getCache(\Foo\Models\BaseModel::CACHE_MEM, 'xxx');

		if (isset ($cache['xxx'])) {
			unset ($cache['xxx']);
			$this->template->msg = 'vymazano z cache';
		} else {
			$this->template->msg = 'v cache nic neni';
		}

		$this->setView('testCacheA');
	}

funkce, ktera vraci cache

	public static function getCache($storageType = self::CACHE_FILE, $namespace = '') {
		if (($storageType != self::CACHE_FILE) && ($storageType != self::CACHE_MEM)) {
			throw new \InvalidArgumentException('Invalid cache identifier passed');
		}

		// check if there is instance of cache
		if (!isset (self::$cache[$storageType]) || !(self::$cache[$storageType] instanceof \Nette\Caching\Cache)) {
			if ($storageType == self::CACHE_FILE) {
				$fileStorage = new \Nette\Caching\FileStorage(\Nette\Environment::getVariable('tempDir'));
				self::$cache[$storageType] = new \Nette\Caching\Cache($fileStorage, $namespace);
			} else {
				// get configuration for memcached
				$conf = \Nette\Environment::getConfig('cache');
				if (!$conf || !isset ($conf['mem']) || !isset ($conf['mem']['host']) || !isset ($conf['mem']['port'])) {
					throw new \ErrorException('Cache is not properly configured or configuration is not stored under "cache" key');
				}

				$memStorage = new \Nette\Caching\MemcachedStorage($conf['mem']['host'], $conf['mem']['port'], (isset ($conf['mem']['prefix']) ? $conf['mem']['prefix'] : ''));
				self::$cache[$storageType] = new \Nette\Caching\Cache($memStorage, $namespace);
			}
		}

		return self::$cache[$storageType];
	}

postupuji-li kroky: 1, 2, 3, 2… v prvnim kroku se data ulozi do cache, v druhem kroku je zobrazim, ve tretim vymazu a pak se vratim na krok dva, kde bych mel dostat zpravu, ze data neexistuji. bohuzel v pripade memcache tam ty informace stale visej.

pokud pouziju FileStorage, priklad funguje. jakmile ale pouziji MemcachedStorage, volani funkce unset naprosto nic nedela… snazil sem se patrat ve zdrojacich, ale moudry z toho nejsem (jedine, co jsem nasel je ze __unset vyhazuje vyjimku :D).

samozrejme sem se zamyslel nad tim, jestli se skutecne pripojuji spravne k memcache, a pripojuji (zkusil sem primo fce php pro memcache), a kdybych se nepripojoval spravne, tak bych ani v kroku 2 nevidel ulozena data.

nevi nekdo, kde je zakopany pes? neda se z cache mazat nejak jinak?

wdolek
Člen | 331
+
0
-

umm, zapomel sem sdelit, ze jde o verzi:
Nette Framework 0.9.3 (revision cc750ea released on 2010–01–28)

jinak sem ale nasel „workaround“ – v podstate je nutne pridat do funkce delete druhy parametr (MemcacheStorage::delete()):

	public function remove($key)
	{
		$this->memcache->delete($this->prefix . $key, 0);
	}

:) prosim o zarazeni opravy

http://cz.php.net/…e-delete.php (prvni komentar k funkci :D)

wdolek
Člen | 331
+
0
-

verze 0.9.5 a stale to neni opravene! :)

romansklenar
Člen | 655
+
0
-

Založ to jako issue na githubu, případně forkni, napiš opravu a pošli pull request, pak se to tam snad dostane.

wdolek
Člen | 331
+
0
-

romansklenar: inu to bych rad, ale s Gitem delam par dni, a poradne to jeste neovladam :) nerad bych ztropil nejakou sasovinu. kdyby se toho mohl ujmout nekdo, kdo se tam jiz na vyvoji podili.

jinak jde o nejaky bug ktery je pri kombinaci nejake verze PHP a nejake verze memcached… (a mozna i pecl-memcache)

Majkl578
Moderator | 1364
+
0
-

wdolek napsal(a):

jinak jde o nejaky bug ktery je pri kombinaci nejake verze PHP a nejake verze memcached… (a mozna i pecl-memcache)

Zkus prvně detekovat v jaké verzi PHP a memcached to (ne)funguje, ať je problém určitý. Já se s takovým problémem nesetkal (ale zatím MemcacheStorage používám jeden den).

wdolek
Člen | 331
+
0
-
apache 2.2.15
php 5.3.2
php-pecl-memcache 3.0.4
memcached 1.4.5

… myslim, ze neni tak zavazne tam pridat ten druhy parametr (zda se, ze tam je odjakziva). jinak „rozsahlejsi“ pruzkum udelal nibblebot, a postnul to primo jako komentar do dokumentace: http://cz.php.net/…e.delete.php

nibblebot at gmail dot com
09-Jul-2010 03:58

the Memcache::delete(key) function is broken on several combinations of memcached+pecl-memcache combinations.

pecl-memcache 2.2.5 + memcached 1.4.2 - Memcache::delete(key) WORKS
pecl-memcache 2.2.5 + memcached 1.4.3 - Memcache::delete(key) DOES NOT WORK
pecl-memcache 2.2.5 + memcached 1.4.4 - Memcache::delete(key) WORKS
pecl-memcache 2.2.5 + memcached 1.4.5 - Memcache::delete(key) WORKS
pecl-memcache 3.0.4 + memcached 1.4.2 - Memcache::delete(key) WORKS
pecl-memcache 3.0.4 + memcached 1.4.3 - Memcache::delete(key) DOES NOT WORK
pecl-memcache 3.0.4 + memcached 1.4.4 - Memcache::delete(key) DOES NOT WORK
pecl-memcache 3.0.4 + memcached 1.4.5 - Memcache::delete(key) DOES NOT WORK

Editoval wdolek (23. 7. 2010 17:10)