将doctrine2实体保存到缓存以加快页面加载

时间:2012-05-29 19:14:50

标签: zend-framework caching doctrine-orm memcached

假设我有一个名为Product的实体,每次用户点击产品信息页面时都会加载此实体。通常我会将对象保存在Zend_Cache(memcache)中一小时,以避免为每个请求命中db,但据我所知,由于Proxy对象,Doctrine2实体无法实现。

所以我的问题是,如何避免为每个请求从数据库加载相同的实体?

[编辑]

我尝试使用像这样的Doctrine Cache

    $categoryService = App_Service_Container::getService('\App\Service\Category');
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl();
    $apple = $cache->fetch('apple');

但是我收到以下错误

  

警告:要求(应用/实体/代理/ _ CG _ /App/Entity/Category.php)   [function.require]:无法打开流:没有这样的文件或目录   在/opt/vhosts/app/price/library/Doctrine/Common/ClassLoader.php上   第163行

这与Zend Cache相同,但由于Proxy类

,您无法序列化实体

5 个答案:

答案 0 :(得分:3)

你有几个选择:

  1. 使用Doctrine的built-in result caching
  2. 尝试通过Zend_Cache将实体粘贴到memcache中。当您将其拉出时,您可能需要将产品合并()回到EM中,因此可以取消引用代理。如果您获取加入任何关联,您需要显示产品信息,而您只是在读取,这个shoudl工作正常。
  3. 根本不缓存实体。缓存生成的任何输出。
  4. 编辑:如果您不关心水合作用开销,那么您使用的是mysql,而您的产品和相关表格不会经常更改,您可能更愿意只依赖于mySQL查询缓存。这是一个相当直率的对象,但很有用,可以提及。

答案 1 :(得分:1)

您可能想尝试为您的实体类实现__sleep__wakeup方法,因为Doctrine 2对实体的序列化/反序列化有特殊要求和限制(将它们存储在Zend_Cache中时会发生这种情况) )。

答案 2 :(得分:0)

我发现这非常奇怪,因为我自己搞砸了这个并且没有任何问题与代理对象存储在数据库中。所以我猜你的配置没有设置100%?

如果您发现配置存在问题,那么请非常了解timdev所说的必须将对象合并回EntityManager,否则您将会遇到奇怪的错误。

可用的第四个解决方案也是将数据检索为数组而不是对象,但当然您会丢失与模块相关的所有功能,这些功能可能并不是您想要的。

答案 3 :(得分:0)

在我看来,更像是配置错误。代理目录和命名空间都没有生成代理或代理有问题。

根据您的配置,可以自动生成代理,也可以手动生成代理。您的代理是否确实是在App/Entity/Proxy下生成的?这确实是正确的目录吗?

可以通过执行doctrine orm:generate-proxies <dest-dir>

手动生成FYI代理

答案 4 :(得分:0)

借用timdev所说的:Doctrine内置缓存,你想使用它。

如果您遇到任何性能问题,或者您是过度热切优化的受害者,我也想知道您的问题。