2013-04-09 6 views
0

У меня есть поисковая система на некоторое время и ничего не нашел.PHP memcache внутренние объекты

При работе с внутренними объектами, такими как DOM или PDO, можно ли их кэшировать с помощью memcache?

Я понимаю, что PDO, вероятно, будет неактуальным, потому что соединение закрыто в конце скрипта - это может быть изменено на постоянные соединения - что делает кеширование более выполнимым ???

Что действительно беспокоит меня, так это отсутствие документации о том, можно ли кэшировать представление объектов DOM в памяти. Файлы конфигурации XML могут быть довольно многословными, и загрузка этих запросов на каждый запрос, построение DOM, вероятно, будет сильно зависеть от ресурсов сервера.

У кого-нибудь есть опыт кеширования, в частности объектов DOM? Должен ли я выбрать PHP-реализацию DOM только для повторного разбора, инициализация DOM не требуется для каждого запроса?

ответ

0

Вы можете кэшировать экземпляр PDO. Вам нужно будет расширить класс PDO и реализовать магический метод __wakeup и __sleep.

Метод __sleep() будет вызываться до serialize() и __wakeup во unserialize() (это не уточнено, когда на инструкции).

Вы должны использовать метод __wakeup для восстановления соединения после несериализации с помощью Memcache.

Я не думаю, что существует большой интерес к кешированию экземпляра PDO.

Большинство основных объектов нельзя кэшировать. Это происходит потому, что они не сериализованы должным образом. Только экземпляры классов, реализующие интерфейс Serializable, могут быть.

Возможно, в некоторых случаях он может работать, если класс имеет только общедоступные свойства.

+0

Беспокойство, которое я испытываю при кешировании чего-то вроде соединения с БД (это, таким образом, что-то подключающее к третьей стороне), состоит в том, что логика, чтобы понять, что такое «существует ли соединение», скорее всего, сидит в конструкторе этот случай) PDO класс. Это означает, что, скажем, вы несериализуете объект, вопрос в том, выполняет ли функция unserialise() эти крайние случаи или нет? Если этого не произойдет, у вас будут неприятные сюрпризы. Лично я бы предпочел. Какова ваша основная причина для его кэширования, есть ли у вас достаточно высокая производительность в кэшировании чего-то подобного? – Sarel

+2

Функции serialize/unserialize не обрабатывают граничные случаи. Вам нужно определить, как ваши объекты могут быть сериализованы путем реализации интерфейса Serializable, или если они могут быть правильно сериализованы, скажем, если у них есть только общедоступные свойства, вы реализуете метод __wakeup, чтобы восстановить соединение самостоятельно. Я не думаю, что кеширование экземпляра PDO может привести к увеличению производительности. То, что вы хотите кэшировать, - это большие структуры данных или большие строки, для которых требуется время обработки. – epicdev

+0

Я не должен был упоминать PDO вообще, мой интерес заключается в кешировании XML из-за накладных расходов на загрузку/синтаксический анализ больших XML-файлов; будь то конфиг или шаблоны для некоторых других функций, таких как шаблонирование. –

Смежные вопросы