Целесообразно ли использовать serialize () для сохранения объекта в нескольких запросах? - PullRequest
1 голос
/ 24 июля 2010

В проекте, над которым я работаю, у меня есть объект, который является своего рода коллекцией с серверной частью базы данных. Точные результаты, которые возвращает эта коллекция, зависят от ее конфигурации, которая сама зависит от количества пользовательских данных. Я хотел бы иметь элемент на странице, который содержит записи в коллекции и может обновляться динамически через запрос AJAX. Мне пришла в голову идея serialize() этого объекта, сохранить его в memcache и включить ключ memcache в качестве параметра в мои вызовы AJAX. Затем я извлеку строку из memcahce, unserialize() it и извлекла бы следующий набор записей из коллекции.

Является ли это хорошим способом достижения такого рода постоянства объектов, которое я хочу сделать этой работой? Я рассмотрел вопрос о сохранении только конфигурации, но мне кажется, что это лучшее решение «установи и забудь» перед лицом будущих изменений в пользовательских элементах управления. Моя главная проблема заключается в том, что с сериализацией могут быть некоторые подводные камни, о которых я не знаю, которые могут сделать это решение не надежным, ненадежным или не очень быстрым. Должен ли я быть обеспокоен каким-либо из этих вопросов?

Ответы [ 2 ]

1 голос
/ 24 июля 2010

Если сериализованные объекты больше, чем просто запросы, которые вы извлекаете из базы данных, и к ним применена большая обработка, то то, что вы предлагаете, на самом деле является очень хорошей оптимизацией.

Две ссылкив частности: http://code.google.com/p/memcached/wiki/FAQ#Cache_things_other_than_SQL_data! http://www.mysqlperformanceblog.com/2010/05/19/beyond-great-cache-hit-ratio/

Оба продвигают использование memcached как находящегося за пределами "кэша строк".

1 голос
/ 24 июля 2010

serialize / unserialize достаточно хорошо работает со скалярами, но может быть более проблематичным при работе с объектами. У меня была пара проблем, которые выдвигают на первый план потенциальные ловушки.

Если какие-либо из ваших свойств объекта являются ресурсами, они не могут быть сериализованы. Вам нужно будет использовать магические методы __sleep и __wakeup, чтобы аккуратно закрыть атрибут ресурса и восстановить его снова при десериализации.

Если ваша коллекция содержит объекты с циклическими ссылками (например, объект cellCollection является массивом объектов ячейки, каждый из которых имеет атрибут, указывающий на родительский объект cellCollection), то они не будут восстановлены при несериализации ... родительский объект каждой ячейки фактически будет клоном исходного родителя. Опять же, __sleep и __wakeup необходимо использовать для восстановления истинных отношений (не тривиальная задача).

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