创建具有可变项的两遍PHP缓存系统
我想实现两遍缓存系统:
- 第一遍生成一个PHP文件,其中包含所有常见内容(例如新闻),并进行了硬编码。然后,数据库具有一个高速缓存表以将这些链接与页面链接(例如," index.php page = 1 style = default"),数据库还存储了一个uptodate字段,如果为false,则该字段将导致第一次通过时重新运行下一次页面被查看。
- 第二遍填写次要详细信息,例如某事物(?)的使用时间有多久,以及诸如"我们以...的身份登录"之类的可变项。
但是我不确定是否有一个高效的实现,它既支持缓存页面也支持非缓存(例如搜索)页面,而无需大量代码和几个查询。
现在,每次加载页面时,都会运行PHP脚本来重新生成页面。对于像搜索这样的页面,这是很好的,因为大多数搜索是不同的,但是对于其他页面(如索引)来说,每次匹配实际上是相同的,但是会生成大量查询并且是一个长脚本。
问题是页面的某些部分会根据用户进行更改,例如"我们以...身份登录..."部分,因此仅保存生成的页面仍将导致10,000个几乎相同的页面。
主要的问题是减少服务器的负载,因为我在共享主机上,此时无法进行升级,但是该站点正在使用服务器中相当大的一部分CPU +在MySQL上施加了合理的负载服务器。
因此,与说静态页面相比要少得多的搜索相比,基本上减少每个页面请求必须完成的工作量,并且始终不重新生成索引上的新闻项之类的东西似乎是一个不错的开始。
我实际上考虑将新闻项硬编码为纯HTML,但这意味着将它们维护在多个位置(因为它们可能用于搜索,并且注释位于该新闻项的页面(即news.php)等)上。 。
解决方案
我们想将结果保存到文件中,并使用如下逻辑将其拉出:
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
接下来是Ken的PEAR的Cache_Lite库的记录,我们可以使用它轻松地缓存部分页面或者整个页面。
如果我们正在运行自己的服务器,则强烈建议我们使用memcached。由于它完全在内存中运行,并且被许多高容量站点广泛使用,因此它的速度要快得多。这是一个非常简单,稳定,无故障的守护程序。就PHP代码而言,我们将使用与Cache_Lite几乎相同的方式来缓存各个页面部分或者整个页面(或者其他任意数据块),并且由于PHP内置了memcache接口,因此使用起来非常容易。
对于超高流量的全页缓存,请看一下将Varnish或者Squid用作缓存反向代理服务器。 (由Varnish提供服务的页面将很容易地比那些到达PHP解释器的页面快100倍。)
记住缓存,我们实际上只需要缓存经常访问的内容。有时,当我们不需要真正的高速缓存策略时,可能会陷入陷阱。对于像主页这样的页面,它每秒被点击几次,我们肯定要对其进行优化以提高速度。对于一个小时可能点击几下的页面(例如一个月前的博客帖子)来说,缓存它不是一个好主意,只会浪费时间,并使事情变得更加复杂且容易发生错误。
我建议使用现有的缓存机制。根据实际需要,我们可能正在寻找APC,memcached,各种模板缓存库...与从头开始编写所有内容相比,更容易/更快地调整编写/测试的代码以满足需要。 (通常,尽管有些情况下我们可能没有选择)
与此类问题一样,我的回答是:
- 为什么需要缓存?
- 应用程序是否在数据库上消耗过多的IO?
- 我们运行了哪些指标?
我们正在谈论要为应用程序增加额外的复杂性,因此我们需要确保确实需要它。
如果数据库是系统中的争用点,则实际上可能会受益于使用内置的MySQL查询缓存。另一个选择是也使用Memcache。