3

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

我拥有的框架是简单的 MVC 框架。我有前端控制器,它启动应用程序,注册类自动加载,设置 php 运行时指令......最后分析 URL 并将请求发送到适当的控制器、方法、动作控制器,无论你想如何调用它。从控制器,我可以访问域对象和可以将域对象持久保存到某些存储的数据映射器,大多数情况下是关系数据库。从控制器我可以访问域对象和数据映射器。

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

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

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

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

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

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

谢谢!

4

1 回答 1

9

操作码缓存可以抵消为每个请求解释 PHP 代码的成本。它与服务器基础架构有关。有点像负载均衡。将其留给您的管理员。或者使用过 *NIX 发行版的人,那不是 ubuntu。

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

  • 周边:

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

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

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

  • 回复

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

    例如,以 StackOverflow 之类的网站为例。如果您决定在侧边栏上创建“过去 24 小时内的热门标签”块,则不可能为每个页面视图重新生成该块。解决此限制的一种方法是每隔一小时左右重新计算标签,并将生成的结果存储在 HTML 片段中。然后可以重复使用此片段。如果缓存的片段是 XHR 使用的一些 JSON,您甚至可以添加客户端过期标头以进一步降低服务器负载。

    您可以仅缓存页面的片段或整个内容。这基本上是在具有 MVC 架构的站点中处理具有静态内容的部分的方式。

  • 模型层

    这是棘手的一点。

    首先你要明白缓存只是另一种形式的存储,这意味着缓存是由特殊的映射器处理的。

    $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
    

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

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

于 2012-10-22T01:28:51.270 回答