Сохранение сущности 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 ответов
У вас есть несколько вариантов:
- использовать доктрины встроенное кэширование результатов
- попробуйте просто вставить объект в memcache через Zend_Cache. Когда вы вытащите его, вам может потребоваться объединить() продукт обратно в EM, чтобы прокси могли быть разыменованы. Если вы получаете-присоединяйтесь к любым ассоциациям, которые вам нужны для отображения информации о продукте, и вы только читаете, этот shoudl работает нормально.
- не кэшировать объект вообще. Кэш какой выход вы вместо этого генерируйте.
редактировать: если вы не заботитесь о накладных расходах гидратации, вы используете mysql, и ваши продукты и связанные таблицы не меняются очень часто, вы можете предпочесть просто полагаться на кэш запросов mySQL. Это довольно тупой предмет, но достаточно полезный, чтобы упомянуть.
вы можете попробовать реализовать __sleep
или __wakeup
методы для вашего класса сущностей, поскольку доктрина 2 имеет особые требования и ограничения в отношении сериализации/десериализации сущностей (что и происходит при их хранении в Zend_Cache).
- вот это руководством.
- Общая информация ограничения, включая сериализацию.
Я нахожу это очень странным, так как я просто возился с этим сам и не имел никаких проблем с прокси-объектом, хранящимся в базе данных. Так что я предполагаю, что ваша конфигурация не настроена на 100% ?
Если вы обнаружите проблему с вашей конфигурацией, то будьте очень осведомлены о том, что timdev сказал вам должны объедините объект обратно в EntityManager, иначе у вас будут странные ошибки в строке.
четвертое решение, доступное для вас тоже извлеките данные в виде массива вместо объекта, но затем, конечно, вы потеряете все функции, связанные с вашим модулем, которые могут быть не совсем нужны вам.
мне кажется, больше похоже на ошибку конфигурации. Либо прокси не были сгенерированы, либо что-то не так с каталогом прокси и пространством имен.
в зависимости от конфигурации прокси могут быть созданы автоматически или вручную. Действительно ли ваши прокси были созданы в App/Entity/Proxy
? Это действительно правильный каталог?
прокси FYI могут быть сгенерированы вручную путем выполнения doctrine orm:generate-proxies <dest-dir>
поддерживая то, что говорит timdev: доктрина имеет встроенное кэширование, вы хотите его использовать.
Я также задаюсь вопросом из вашего вопроса, испытываете ли вы какие-либо проблемы с производительностью или являетесь жертвой чрезмерно нетерпеливой оптимизации.