Posts Tagged: cache

2009
04
márc

Rowset cache-be pakolása


A Zend Framework egyik igen kedvelt szolgáltatása – amire nap mint nap szoktam támaszkodni és szinte már elkerülhetetlen a használata – a Zend_Cache modul. Ha a szerver erőforrások lehetővé teszik, akkor előszeretettel építkezek memcached backendre, eddig elég jól bevált. Volt már például, hogy egy nagyon nagy látogatottságú portál esetén a memcached segítségével a szerver load-ot kevesebb mint a tizedére sikerült visszavenni.

Visszatérő dolog, hogy a cache-ben egy lekérdezés eredményeként visszakapott Zend_Db_Table_Rowset ovjektumot szeretnék letárolni. Persze általában sokkal praktikusabb és optimálisabb az eredményt tömbként átadni a cache-nek és erre a toArray() metódus egyszerű megoldást kínál, azonban ezzel el is veszítjük a Zend_Db által kínált fantasztikus adatbázis absztrakció nyújtotta kényelmet. Például a tömb használatával el lehet felejteni egy adott adatbázis rekordhoz kapcsolódó rekordok közvetlen elérését a findParentRow() és findDependentRowset() függvényekkel, a rekord módosításáról nem is beszélve. A Zend_Db_Table_Rowset cache-ben történő tárolásával azonban az a baj, hogy a szerializáció alkalmával a rowset un. disconnected állapotba kerül, mivel a szerializált ovjektum stringként tárolódik, ami az adatbázisra nézve komoly biztonsági kockázatokat jelentene (db jelszavakra és hasonlókra). Tehát amikor a cache-ből kiolvassuk az adott rowset-et akkor a rekordok mezői ugyan elérhetőek, de nagyjából ugyanannyit érünk vele mintha tömbről volna szó, mert a disconnected állapotban a módosítás ugyanúgy nem működik és a többi közvetlen adatelérést biztosító funkció is használhatatlan.

A megoldás persze pofon egyszerű, hiszen mindössze annyit kell elérni, hogy a deszerializált rowset adatbázis kapcsolatát “felélesszük”. Erre pedig a setTable() függvény tökéletesen megfelel:

if (!$items = $cache->load('items')) {
	$select = $product->select() /* ... */;
	$items = $product->fetchAll($select);
	$cache->save($items, 'items');
}
$items->setTable($product);

A ZF Programmer’s Reference Guide ide vonatkozó passzusa: Serializing and Unserializing a Rowset .