5

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

  • 第一遍生成一个 PHP 文件,其中包含硬编码的所有常见内容(例如新闻项目)。然后数据库有一个缓存表来链接这些页面(例如“index.php page=1 style=default”),数据库还存储一个uptodate字段,如果为false,则导致第一次通过在下一次页面重新运行被查看。

  • 第二遍填写次要细节,例如某件事(?)是多久以前,以及诸如“您以...登录”之类的可变项目。

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

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

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

主要关注的是减少服务器上的负载,因为我在共享主机上,此时无法升级,但该站点正在使用服务器的相当大一部分 CPU + 对 MySQL 施加了相当大的负载服务器。

因此,基本上最大限度地减少每个页面请求必须完成的工作量,而不是一直在索引上重新生成诸如新闻项目之类的东西似乎是一个好的开始,相比之下,搜索是一个静态页面少得多的页面。

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

4

6 回答 6

6

我支持 Ken 对 PEAR 的Cache_Lite库的推荐,您可以使用它轻松地缓存部分页面或整个页面。

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

对于超高流量的整页缓存,看看做VarnishSquid作为缓存反向代理服务器。(由 Varnish 提供的页面将比 PHP 解释器的任何页面快 100 倍。)

请记住缓存,您实际上只需要缓存经常访问的内容。有时,当您并不真正需要它时,开发一个非常复杂的缓存策略可能是一个陷阱。对于像您的主页这样每秒被点击多次的页面,您肯定希望对其进行优化以提高速度;对于一个每小时可能获得几次点击的页面,比如一个月前的博客文章,缓存它是个坏主意,你只会浪费你的时间,让事情变得更加复杂和容易出错。

于 2008-10-01T07:46:25.947 回答
4

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

于 2008-10-01T07:30:55.283 回答
3

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

于 2008-10-01T07:28:14.743 回答
1

您希望将结果保存到文件并使用如下逻辑将它们拉回:

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

需要明确的是,您不需要两次通过,因为您可以保存页面的某些部分并让其余部分保持动态。

于 2008-10-01T07:25:05.920 回答
1

与此类问题一样,我的回答是:

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

您正在谈论为您的应用程序增加额外的复杂性,因此您需要非常确定您确实需要它。

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

于 2008-10-01T07:48:57.003 回答
0

我建议使用现有的缓存机制。根据您的实际需要,您可能正在寻找 APC、memcached、各种模板缓存库......调整编写/测试的代码以满足您的需要比从头开始编写所有内容更容易/更快。(通常情况下,尽管您可能没有选择的情况)

于 2008-10-01T07:47:23.700 回答