MVC框架中的缓存策略?

otp*_*ran 3 php model-view-controller memcached caching apc

我编写了自己的小PHP MVC框架,现在我在PHP MVC框架中探索缓存策略.我在想什么可以缓存,在哪里以及如何.

我拥有的框架是简单的MVC框架.我有前置控制器,启动应用程序,注册类自动加载,设置php运行时指令......最后分析URL并将请求分派给适当的控制器,方法,动作控制器,如何调用它.从控制器,我可以访问域对象和数据映射器,它们可以将域对象持久保存到某个存储,大部分时间是关系数据库.从控制器我可以访问域对象和数据映射器.

因此,就缓存而言,这些是我所知道的事情,我知道我现在可以做的事情.使用PHP,我可以使用作为操作码缓存的APC缓存,但我也可以使用它将变量保存到RAM中.然后我可以使用Memcache和Memcahed作为APC缓存工作,但我可以从不同的服务器访问存储的缓存如果我必须扩展.而这两个不是操作码缓存.

据我所知,我可以做这些事情:

  1. 当在控制器中时,我可以将域对象保存到缓存中,因此如果我已经在缓存中已经拥有该域对象,那么每次都不必打开与数据库的连接.

  2. 我可以构建我的缓存系统,它会在引导程序中分析URL,然后在存在具有该页面URL的缓存时获取该URL的已解释页面,如果不存在则处理请求然后将该页面保存到缓存中并将其与当前URL关联

所以,正如你所看到的,我真的不知道如何在我的MVC中实现缓存,我应该在哪里缓存内容,如何以及存在哪些可能性.

那么有人可以更好地解释这一点,或者将我重定向到一些我可以学习缓存的好文章吗?

谢谢!

ter*_*ško 9

操作码缓存用于抵消为每个请求解释PHP代码的成本.它与服务器基础架构有关.有点像负载平衡.留给你的管理员.或者使用*NIX发行版的人,这不是ubuntu.

在MVC应用程序中,有3个点可以缓存内容:

  • 周边:

    应用程序的一部分与MVC模式本身并不相关,但涉及到MVC:路由机制和(如果使用它)DIC.

    您可以为路由机制缓存的内容取决于实现.如果您使用更可读的模式生成一些正则表达式,那么您可以缓存生成的表达式.并且还可以缓存通常由路由产生的部分参数.这两个在中/大型站点都是合理的,对于小型站点来说完全没有意义.

    如果您决定使用DIC(我个人认为它是反模式,但所有酷孩子都不同意),那么缓存几乎是强制性的,因为正确编写的DIC将利用反射.反思很慢.

  • 响应

    有时应用程序的某些部分需要大量资源才能创建.如果您的MVC解释具有完全实现的视图,则可以缓存一些用于生成输出的模板.

    例如,像StackOverflow一样获取网站.如果您决定在侧边栏上创建"过去24小时内的顶级标记"块,则无法为每个页面视图重新生成该标记.解决此限制的一种方法是仅在每小时左右重新计算标记,并将生成的结果存储在HTML片段中.然后可以重复使用该片段.如果缓存的片段是XHR使用的某些JSON,您甚至可以添加客户端expire头以进一步降低服务器负载.

    您可以只缓存页面片段或整个事物.这基本上是如何在具有MVC-imbued架构的站点中处理具有静态内容的部分.

  • 模型层

    这是棘手的一点.

    首先,您必须了解缓存只是另一种存储形式,这意味着缓存由特殊的映射器处理.

    $user = new User;
    $cache = new UserCacheMapper;
    
    $user->setId( 42 );
    if ( ! $cache->fetch( $user ) )
    {
        $storage = new UserDbMapper( $pdo );
        $storage->fetch( $user );
    
        $cache->store( $user );
    }
    
    // the $user object has been initialized
    
    Run Code Online (Sandbox Code Playgroud)

    缓存映射器也是缓存失效的地方,这样您就可以在项目的任何阶段添加缓存机制.

    虽然,我建议停止使用控制器来处理域对象和存储之间的交互.您基本上是在表示层中泄露域业务逻辑.我建议创建包含此部分应用程序的服务,并让您将控制器与域逻辑隔离开来.