Vnořené criticalSections()

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

Narazil jsem na zajímavý jev, kdy při ukládání jedné cache se zároveň vytváří cache jiná, přičemž u obou ukládání se používá callback. Aplikace se tak pokouší vstoupit dvakrát do jedné kritické sekce…

Pro představu:

// First::getTree()
$that = $this;
$this->cache->save($key, function ($that) {
	// předpokládám ($that->second instanceof Second) === TRUE
	return $that->second->getItems();
}, array (
	// ...
);


// Second::getItems()
$this->cache->save($key, function () {
	return array('first', 'second', '...',);
}, array(
	// ...
);

Vše umírá za vyhození Nette\InvalidStateException:
Critical section has already been entered.

Jak z toho ven? (bug nebo feature?)

Filip Procházka
Moderator | 4668
+
0
-

V první řadě, pokud jen voláš funkci, není potřeba ji obalovat do closury.

$this->cache->save($key, callback($this->second, 'getItems'), array (
        // ...
);

No a co se týče toho zanoření, vyzkoušel bych Cache::call

uestla
Backer | 796
+
0
-

Díky za tip! Nevýhoda toho je, že se nedají specifikovat parametry (expirace, apod.) :-(

Filip Procházka
Moderator | 4668
+
0
-

Pokud potřebuješ i specifikovat parametry, tak se budeš muset ochudit o luxus krásného zápisu a ukládat rovnou výsledná data.

uestla
Backer | 796
+
0
-

A vymýšlet unikátní klíč >:'(

Filip Procházka
Moderator | 4668
+
0
-

Toho bych se moc nebál. To čím nakrmíš klíč pro uložení, tak se serializuje, takže tam můžeš mít i pole, prakticky cokoliv.