nefunguje mazani z memcache
- wdolek
- Člen | 331
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
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)
- romansklenar
- Člen | 655
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
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
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
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)