Сохранение сущности doctrine2 в кэш для ускорения загрузки страницы

Допустим у меня есть сущность под названием Product и этот объект загружается каждый раз, когда пользователь попадает на страницу информации о продукте. Обычно я сохраняю объект в zend_cache (memcache) в течение часа, чтобы избежать попадания в БД для каждого запроса, но, насколько я понимаю, это невозможно с объектами Doctrine2 из-за прокси-объектов.

Итак, мой вопрос: как я могу избежать загрузки одного и того же объекта из базы данных для каждого просьба?

[EDIT]

Я пытался использовать кэш доктрины, как это

    $categoryService = App_Service_Container::getService('AppServiceCategory');
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl();
    $apple = $cache->fetch('apple');

но я получаю следующую ошибку

предупреждение: требуется (App / Entity / Proxy/_CG_ / App / Сущность / Категория.РНР) [функция.требуют]: не удалось открыть поток: нет такого файла или каталога in/opt/vhosts/app/price/library/Doctrine/Common / ClassLoader.php на линия 163

Это то же самое для кэша Zend, а также вы не можете сериализовать сущность из-за прокси-класса

5 ответов


У вас есть несколько вариантов:

  1. использовать доктрины встроенное кэширование результатов
  2. попробуйте просто вставить объект в memcache через Zend_Cache. Когда вы вытащите его, вам может потребоваться объединить() продукт обратно в EM, чтобы прокси могли быть разыменованы. Если вы получаете-присоединяйтесь к любым ассоциациям, которые вам нужны для отображения информации о продукте, и вы только читаете, этот shoudl работает нормально.
  3. не кэшировать объект вообще. Кэш какой выход вы вместо этого генерируйте.

редактировать: если вы не заботитесь о накладных расходах гидратации, вы используете mysql, и ваши продукты и связанные таблицы не меняются очень часто, вы можете предпочесть просто полагаться на кэш запросов mySQL. Это довольно тупой предмет, но достаточно полезный, чтобы упомянуть.


вы можете попробовать реализовать __sleep или __wakeup методы для вашего класса сущностей, поскольку доктрина 2 имеет особые требования и ограничения в отношении сериализации/десериализации сущностей (что и происходит при их хранении в Zend_Cache).


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

Если вы обнаружите проблему с вашей конфигурацией, то будьте очень осведомлены о том, что timdev сказал вам должны объедините объект обратно в EntityManager, иначе у вас будут странные ошибки в строке.

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


мне кажется, больше похоже на ошибку конфигурации. Либо прокси не были сгенерированы, либо что-то не так с каталогом прокси и пространством имен.

в зависимости от конфигурации прокси могут быть созданы автоматически или вручную. Действительно ли ваши прокси были созданы в App/Entity/Proxy ? Это действительно правильный каталог?

прокси FYI могут быть сгенерированы вручную путем выполнения doctrine orm:generate-proxies <dest-dir>


поддерживая то, что говорит timdev: доктрина имеет встроенное кэширование, вы хотите его использовать.

Я также задаюсь вопросом из вашего вопроса, испытываете ли вы какие-либо проблемы с производительностью или являетесь жертвой чрезмерно нетерпеливой оптимизации.