创建具有可变项

创建具有可变项

问题描述:

我想实现一个双通道缓存系统两遍PHP缓存系统:创建具有可变项

  • 第一遍生成一个PHP文件,所有的共同的东西(如新闻条目),硬编码。数据库然后有一个缓存表来链接这些页面(例如“index.php page = 1 style = default”),数据库也存储一个uptodate字段,如果为false则导致第一遍在下次页面时重新运行被观看。

  • 第二次通过填充次要的细节,比如多久之前有东西(?),以及诸如“您已登录为...”等可变项目。

但是我不知道在一个有效的实施,同时支持缓存和非缓存(例如,搜索)的网页,而无需大量的代码和几个查询。

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

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

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

因此,基本上最小化每个页面请求需要完成多少工作,而不是像索引上的新闻项目那样重新生成索引似乎是一个好的开始,相比之下,搜索是一个不太静态的页面。

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

我第二次肯介绍了PEAR的Cache_Lite库,你可以用它来轻松地缓存页面的一部分或整个页面。

如果您正在运行自己的服务器,则强烈建议使用memcached。由于它完全在内存中运行并且被大量大量网站广泛使用,因此速度更快。这是一个非常简单,稳定,无故障的守护进程。在你的PHP代码方面,你会用它的用法与Cache_Lite一样,缓存各个页面的部分或整页(或数据的其他任意的斑点),这是非常容易使用,因为PHP有​​memcache interface built in

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

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

你想将结果保存到这样的文件,并使用逻辑来拉他们回来了:

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

需要明确的是,你并不需要两遍,因为你可以保存网页的部分并保持其余的动态。

对于服务器端缓存使用类似Cache_Lite(并让有关文件锁定,到期日期,文件损坏别人的担心)

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

+0

我看不出这个fullfills我的任何需求,因为高速缓存中的,似乎是一生的定义,这对我的网站和B-doesn't允许常用更换部件(例如:用户名不相关)针对每个请求进行更新,而无需重新构建整个页面... – 2008-10-04 18:04:34

我会建议使用现有的缓存机制。根据你真正需要的东西,你可能正在寻找APC,memcached,各种模板缓存库......更容易/更快地调整书面/测试代码以满足你的需求,而不是从头开始写所有东西。 (通常,尽管可能存在的情况下,当你没有choisce)

像往常一样与这种类型的问题,我的回答是:

  • 为什么需要缓存?
  • 你的应用程序在你的数据库上消耗了太多的IO吗?
  • 你跑什么指标?

您正在讨论的是为您的应用程序添加额外的复杂程度,因此您需要非常确定您确实需要它。

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