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 .









