Кеширование xml дерева

voituk

прозревший
Кеширование xml дерева

В проекте описание страницы (модули, мета-теги, и тд и тп) задается xml файлом.
Зная, что разбор xml - довольно ресурсоемкая процедура, решил сделать кеширование DOM дерева таким образом:

1. При запросе страницы, проверяю не лежит ли она в кеше. Если есть - десериализирую уже разобраное dom дерево.
2. Если в кеше нету описания страницы тогда выполняю разбор xml данных функцией domxml_xmltree() и записую их в кеш.

Интерисует даст ли это прирост в производительности, или не стоит так извращаться?

вот код (Config - массив с настройками):
PHP:
		/**
		* Return XML data tree
		* @param string $file_path XML file path
		* @return array Array of DOMXML Objects
		* @see $Config['cache_xml'], domxml_xmltree()
		*/
		function getXMLTree($file_path) {
			global $Config;
			if (!is_file($file_path)) user_error("Cant read file <b>\"$file_path\"</b>", E_USER_ERROR);
			
			// Get tree from cache if need
			$md5 = md5($file_path);
			$md5path = $Config['cache_dir']."/$md5.cache";
			$md5file = md5_file($file_path);
			if ($Config['cache_xml'] && is_file($md5path)) {
					$Result = unserialize(file_get_contents($md5path));
					if ($Result->compression==$md5file) return $Result;
			}
			
			// Parse xml data
			$xml_str = @file_get_contents($file_path);
			$Result = domxml_xmltree($xml_str);
			//if ()
			
			//Write data into cache if need
			if ($Config['cache_xml']) {
				$Result->compression = $md5file;
				file_put_contents($md5path, serialize($Result));
			}
			return $Result;
		}
 

[sid]

Новичок
Я так думаю прирост будет заметен, только на больших XML-файлах. На маленьких как бы не было обратного эффекта. Потому что, Сам XML файл по бъему будет меньше чем его сериализированное дерево! А файловые операции вещь медленная. Вот если бы кешировать дерево не на диске а памяти (memcache или shmem)? Можно было бы добиться интерестных результатов!
 

olpa

Новичок
В своё время я подобными вещами развлекался. И вот цитата из отчёта:
If applications are going to interchange XML (for example, client asks database for data), one program should convert memory representation of XML to some format and second program should convert this format back to memory. If applications are written in the same programming language, the simplest way is to use serialization libraries. But Bruce Martin [BRUCE] says: Surprisingly, the performance results presented below indicate that a textual representation of XML is a far more efficient representation than a serialized DOM representation. Also, the time required to externalize a DOM representation and reparse the textual form is cheaper than the direct Java serialization and deserialization of the DOM.
 

voituk

прозревший
В результате бенчмарков определил что на xml-файлах в 4-5Кб этот метод дает прирост в 2 раза.
Вот только если смотреть абсолютные значения времени - то заморачиваться судя по свему не стоит :)
На файлах в 20-30Кб (правда совсем несложных) прирост ощутим даже визуально.
 

slach

Новичок
domxml_xmltree
php4 only ;((

а так идея вполне правильная
Сериализация проходит БЫСТРЕЕ чем XML парсинг
в основном за счет именно более строгого формата данных

для php5 к сожалению пока сериализация DOMDocument объекта не предусмотрена -( что напрягает без меры...
 
Сверху