Cache a SimpleXMLElement Object
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- o5
- Člen | 416
Zdravim, chtel bych se zeptat, co delam spatne. Delam import xml a nedari se mi do cache ulozit zparsovany XMLko.
$url = 'example.com/export.xml';
if ($xml = file_get_contents($url)){
$data = simplexml_load_string($xml);
$cache = Environment::getCache();
$cache->save('data', $data, array(
'expire' => time() + 60 * 5,
));
print_r($cache['data']);
}
vraci warning
SimpleXMLElement Object
Warning: print_r() [function.print-r]: Node no longer exists....
Editoval o5 (7. 8. 2009 9:57)
- Ondřej Mirtes
- Člen | 1536
Tento problém jsem před nějakou dobou taky řešil, háček byl v tom, že objekt tohoto typu použil David ve své knihovně Twitter for PHP. A v PHP nejde serializovat pouze typ resource a právě SimpleXMLElement. Ale pro něj alespoň existuje malý trik. Použití:
private function serializeXml($xml) {
return str_replace(
array('O:16:"SimpleXMLElement":0:{}', 'O:16:"SimpleXMLElement":'),
array('s:0:"";', 'O:8:"stdClass":'),
serialize($xml)
);
}
private function unserializeXml($xml) {
return unserialize(str_replace(array('O:16:"SimpleXMLElement":0:{}', 'O:16:"SimpleXMLElement":'), array('s:0:"";', 'O:8:"stdClass":'), $xml));
}
A poté v nějaké render metodě:
$cache = Environment::getCache();
//caching
if (!isset($cache['twitter'])) $cache->save('twitter', $this->serializeXml($model->load(false)), array(
'expire' => time() + Environment::getConfig('twitter')->expire,
));
$template->tweets = $this->unserializeXml($cache['twitter']);
- David Grudl
- Nette Core | 8282
Spíš bych doporučoval serializovat pomocí
return $xml->asXml()
ad iterování: SimpleXMLElement neimplementuje rozhraní Iterator nebo IteratorAggregate a využívá nějaký systémový hack, takže nad ním nelze iterovat přes SmartCachingIterator. Řešením jen nahradit SimpleXMLElement za potomka SimpleXMLIterator.