代码之家  ›  专栏  ›  技术社区  ›  Fire Lancer

使用可变项创建两遍PHP缓存系统

  •  5
  • Fire Lancer  · 技术社区  · 16 年前

    我想实现一个两通缓存系统:

    • 第一个过程生成一个PHP文件,其中包含所有常见的硬编码内容(例如新闻项)。然后,数据库有一个缓存表将它们与页面链接(例如“index.php page=1 style=default”),数据库还存储了一个uptodate字段,如果为false,则会在下次查看页面时重新运行第一次传递。

    • 第二遍填充了一些小细节,例如多长时间以前发生了什么(?)是的,以及诸如“您登录为…”之类的可变项。

    但是,我不确定是否有一个高效的实现,它支持缓存和非缓存(例如搜索)页面,没有大量的代码和几个查询。

    现在,每次加载页面时,都会运行PHP脚本来重新生成页面。对于像搜索这样的页面,这是很好的,因为大多数搜索是不同的,但是对于其他页面,比如索引,对于每个点击来说,这几乎是相同的,但是会生成大量的查询,并且是一个相当长的脚本。

    问题是页面的某些部分确实会根据每个用户进行更改,例如“您登录为…”部分,因此仅保存生成的页面仍然会导致10000个几乎相同的页面。

    主要的问题是减少服务器上的负载,因为我在共享主机上,目前还负担不起升级费用,但是该站点使用了相当大一部分的服务器CPU+在MySQL服务器上施加了公平的负载。

    因此,基本上最小化每个页面请求所需的工作量,而不总是重新生成索引上的新闻项之类的内容似乎是一个很好的开始,相比之下,搜索这个静态页面要少得多。

    我实际上考虑将新闻项目硬编码为纯HTML,但这意味着要在多个地方维护它们(因为它们可能用于搜索,并且注释位于专门用于该新闻项目的页面(即news.php)等)。

    6 回复  |  直到 13 年前
        1
  •  6
  •   joelhardi    16 年前

    我把肯恩的梨唱片放在第二位。 Cache_Lite 库,您可以使用它轻松缓存页面的任何部分或整个页面。

    如果您运行自己的服务器,我强烈推荐 memcached 相反。由于它完全在内存中运行,并且被许多大容量站点广泛使用,所以速度快得多。它是一个非常简单、稳定、无故障的守护进程。就PHP代码而言,使用它的方式与缓存Lite非常相似,可以缓存不同的页面部分或整页(或其他任意的数据块),而且非常容易使用,因为PHP具有 memcache interface built in .

    对于超高流量的整页缓存,请看一下 Varnish Squid 作为缓存反向代理服务器。(使用Varnish服务的页面将比使用PHP解释器的页面快100倍。)

    记住缓存,您只需要缓存经常访问的内容。有时,当您不真正需要时,开发一个非常复杂的缓存策略可能是一个陷阱。对于像你的主页这样每秒点击几次的页面,你肯定想优化它的速度;对于一个小时点击几次的页面,比如一个月前的博客文章,缓存它是一个坏主意,你只会浪费时间,使事情变得更复杂,更容易出错。

        2
  •  4
  •   jochil    16 年前

    我建议不要重新发明轮子…有些模板引擎支持缓存,比如 Smarty

        3
  •  3
  •   Ken    16 年前

    对于服务器端缓存,使用类似 Cache_Lite (让其他人担心文件锁定、到期日期、文件损坏)

        4
  •  1
  •   Oli    16 年前

    您希望将结果保存到一个文件中,并使用类似这样的逻辑将其拉出:

    if filename exists
        include filename
    else
        generate results
        render to html (as string)
        write to file
        output string or include file
    endif
    

    为了清楚起见,您不需要两次通过,因为您可以保存页面的一部分并保持其余部分的动态性。

        5
  •  1
  •   Toby Hede    16 年前

    像往常一样,对于这类问题,我的回答是:

    • 为什么需要缓存?
    • 您的应用程序是否在数据库中消耗了太多IO?
    • 您运行了哪些指标?

    你说的是给你的应用增加一个额外的复杂性,所以你需要非常确定你确实需要它。

    如果数据库是您系统中的争用点,那么使用内置的mysql查询缓存实际上可能会受益。另一个选项是使用memcache。

        6
  •  0
  •   f13o    16 年前

    我建议使用现有的缓存机制。根据您真正需要的,您可能正在寻找apc、memcached、各种模板缓存libs…为了满足您的需求,对编写/测试的代码进行调优比从头开始编写所有代码更容易/更快。(通常情况下,尽管有些情况下你没有选择权)