Vnořené criticalSections()
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- uestla
- Backer | 796
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
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
- Filip Procházka
- Moderator | 4668
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.
- Filip Procházka
- Moderator | 4668
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.