Сериализация DOM-узлов

Коля Дубр

Новичок
Сериализация DOM-узлов

Здравствуйте, all!

Есть система, использует XML/XSLT (DOM PHP5). Каждый модуль собирает свой DOM-узел, затем все вместе отдается XSLT-процессору. Например, один модуль собирает менюшку, другой - контент, третий - "последние новости" и т.д.

Так вот, результат работы отдельных модулей можно/нужно кешировать. Сейчас у меня все устроено несколько криво: сначала собирается структура массивов/объектов, которая при необходимости сериалайзится в файл, затем из этой структуры генерируется кусок XML-дерева. Ясно, что это неправильно :) Вопрос: есть ли способ каким-то образом закешировать отдельный DOM-узел (поддерево), и быстро вставить его в основное дерево? На ум приходит вариант с importNode туда-сюда, но почему-то он кажется мне большим шаманством :) Может можно проще?

P.S. memcached настраивать проблемно, хочется обойтись файловой системой.

Заранее благодарен.
 

dark-demon

d(^-^)b
каждому модулю - по отдельной трансформации с кэшированием результата
 

Коля Дубр

Новичок
dark-demon
Ага, думал об этом - завести на каждый модуль DOMDocument и работать с ними по отдельности. Тут есть несколько неясностей:

1. Не будет ли накладно жонглировать десятком документов? Надо проверить :)

2. Сборка итогового результата (всех модулей) получается не очень красивой. Видно несколько способов организовать, но не видно одного оптимального.

3. Бывают случаи, когда вывод одного модуля в HTML располагается в разных местах - например, основное меню сверху, а подразделы - сбоку. Поэтому кэшировать результат трансформации не всегда возможно, либо надо придумывать, как обрабатывать такие ситуации (лишние термины - не очень здорово).

4. Хотелось бы иметь возможность отдавать трансформацию на клиент. Если при одном большом XML и одной большой таблица стилей это как-то можно организовать, то как быть с несколькими таблицами стилей - совсем неясно. Но это только в теории, в ближайшей перспективе не самая нужная возможность.

Вообще, если кто-нибудь помнит интересные обсуждения по организации такого рода систем (модульность + XSLT + кэширование) - буду благодарен за ссылки, с ходу кроме раз и два, ничего интересного не нашел.
 

Коля Дубр

Новичок
CatManZero
Смотрел в его сторону, для вставки XML-поддерева в документ это то что нужно. Но вот как уже существующее DOM-поддерево превратить во что-то подобное (т.е. строку с куском XML-кода) - не понял. Единственный вариант, который придумал - создать пустой DOMDocument, импортировать туда наш узел, и сохранить в строку - но тогда и загружать это хозяйство будет правильнее через importNode - но это все как-то криво.

Хочется чего-то такого:

PHP:
		if ($node = $cache->getNode('module_name', 'action_name', $doc)) {
			// Ищем XML-аутпут модуля module_name, операции action_name
			// Кэш проверяет актуальность фрагмента и т.д.
			// возвращаяет DOMElement, привязанный к нашему документу
			$module_node = $node;
		} else {
			$module_node = $doc->createElement('module');
			// заполняем нод какими-то данными
			// т.е. тут выполняется основная работа модуля
			$module_node->setAttribute('name', 'module_name');
			// и записываем в кэш
			$cache->saveNode($module_node, 'module_name', 'action_name');
		}
		// вставляем в основное дерево то что получилось
		$main_node->appendChild($module_node);
Соответственно, заполнение узла данными - выносится в рабочий метод, а эта штука откуда-нибудь наследуется.
Вот, как бы этот $cache реализовать :)
 

CatManZero

Новичок
Можно сериализовать dom модуля в xml вот так:
PHP:
$xml = $doc->saveXML($module_node)
После этого записать $xml в файл, а потом восстанавливать с помощью фрагментов.

Другой вопрос: на сколько быстро операция восстановления будет проходить?..
 

Коля Дубр

Новичок
CatManZero
Большое спасибо, то что нужно! К своему стыду, не знал, что saveXML() может сохранять отдельный узел, всегда считал, что он работает только с документом, целиком.

Попробую, будет результат - поделюсь.
 

slach

Новичок
Коля
тебе сказали
кешируй РЕЗУЛЬТАТ ТРАНСФОРМАЦИИ в виде HTML для модуля

в хеш ключа при этом учитывай имя шаблона
параметры вызова модуля
параметры юзера если выдача зависит от этого и т.п.

итоговый документ собирай простой конкатенацией

кешировать DOM дерево с прямым маппингов в память в PHP нельзя
сериализация в XML и восстановление - не сильно быстрее чем запросы в SQL
 

Коля Дубр

Новичок
slach
Всему свое время :)
Я полностью согласен, что кэшировать HTML модуля - куда полезней. Но в моем случае для этого придется довольно серьезно переписать байду, на которой куча всего работает. При написании следующей байды - попробуй кэшировать результат трансформации. Вообще, это тема довольно обширная, как все организовать правильно. Если кому-то интересно, можно создать отдельный топик. А тут - надо было решить один конкретный вопрос (см. заголовок :)).

Собственно, я накидал тестик - см. описание и исходники. Буду благодарен за критику, наверняка где-нибудь накосячил 6)

Вариант с documentFragment (CatManZero, еще раз спасибо ;) ) вроде вполне пристоен. Ради интереса могу добавить туда реальный SQL и посмотреть время прогона без кэша.
 
Сверху