题
为 PHP 站点实现缓存的最佳方法是什么?显然,有些东西不应该被缓存(例如搜索查询),但我想找到一个好的解决方案来确保避免“挖掘效应”。
我知道有适用于 WordPress 的 WP-Cache,但我正在编写一个不是基于 WP 构建的自定义解决方案。我有兴趣编写自己的缓存(如果它足够简单),或者您可以向我指出一个不错的轻型框架。不过我对 Apache 不太了解,所以如果它是一个 PHP 框架那么它会更合适。
谢谢。
解决方案
如果代理缓存不存在问题,并且您正在提供完整的 HTML 文件,则完全绕过 PHP 即可获得最佳性能。研究如何 WP超级缓存 作品。
未缓存的页面将复制到与您的网站具有相似 URL 结构的缓存文件夹中。在以后的请求中,mod_rewrite 会记录缓存文件的存在并提供服务。其他 RewriteCond 指令用于确保评论者/登录用户看到实时 PHP 请求,但大多数访问者将直接由 Apache 提供服务。
其他提示
您可以使用 输出缓冲 有选择地保存部分输出(您想要缓存的部分)并在时间不够长时将其显示给下一个用户。这样,您仍然可以动态渲染页面的其他部分(例如,可自定义的框、个人信息)。
最好的方法是使用代理缓存(Squid、Varnish)并提供适当的 Cache-Control/Expires 标头以及 ETags :看 Mark Nottingham 的缓存教程 有关缓存如何工作以及如何从缓存代理中获得最大性能的完整说明。
还请查看 内存缓存, ,并尝试在其中缓存数据库查询(或者更好的是预渲染的页面片段)。
我会推荐 内存缓存 或者 APC. 。两者都是内存缓存解决方案,具有极其简单的 API 和大量库。
这两个服务器的问题是您需要将它们安装在您的 Web 服务器或另一台服务器(如果是 Memcached)上。
APC
优点:- 简单的
- 快速地
- 还加快 PHP 执行速度
- 不适用于分布式系统,每台机器都将其缓存存储在本地
内存缓存
优点:- 快(大约)
- 可以安装在单独的服务器上供所有Web服务器使用
- 经过严格测试,由 LiveJournal 开发
被所有大佬使用(Facebook、Yahoo、Mozilla)
缺点:比 APC 慢
- 可能的网络延迟
- 配置稍微多一点
我不建议你自己写,那里有很多。如果您无法在网络服务器上安装软件,您可以使用基于磁盘的缓存,但可能存在竞争问题需要处理。一个请求可能正在写入文件,而另一个请求正在读取。
实际上,您可以缓存搜索查询,甚至可以缓存几秒钟到一分钟。除非您的数据库每秒更新几次以上,否则一些延迟是可以的。
PHP Smarty 模板引擎(http://www.smarty.net)包括一个相当先进的缓存系统。
您可以在 Smarty 手册的缓存部分找到详细信息: http://www.smarty.net/manual/en/caching.php
您似乎正在寻找 PHP 缓存框架。我向您推荐模板系统TinyButStrong,它带有一个非常好的CacheSystem插件。它简单,轻便,可定制(你可以缓存你想要的html文件的任何部分),非常强大^^
页面或部分页面的简单缓存 - Pear::CacheLite 类。我还使用 APC 和 memcache 来处理不同的事情,但到目前为止我看到的其他答案更多的是用于更完整、更复杂的系统。如果您只需要节省一些精力来重建页面的一部分 - 带有文件支持存储的 Cache_lite 就完全足够了,而且实现起来非常简单。
瞪羚计划 (一个开源 torrent 站点)提供了在该站点上设置 Memcached 的分步指南,您可以在您可能想要设置的任何其他可处理大量流量的网站上轻松使用该指南。
获取源代码并阅读文档。