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 | 8285
 
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.