12

为 PHP 站点实现缓存的最佳方法是什么?显然,有些东西不应该被缓存(例如搜索查询),但我想找到一个好的解决方案来确保我避免“挖掘效应”。

我知道 WordPress 有 WP-Cache,但我正在编写一个不是基于 WP 构建的自定义解决方案。我有兴趣编写自己的缓存(如果它足够简单的话),或者您可以向我指出一个不错的轻量级框架。虽然我不太了解 Apache,所以如果它是一个 PHP 框架,那么它会更合适。

谢谢。

4

8 回答 8

16

您可以使用输出缓冲来选择性地保存部分输出(您想要缓存的部分)并在时间不够长时将它们显示给下一个用户。这样,您仍然可以即时呈现页面的其他部分(例如,可自定义的框、个人信息)。

于 2008-09-10T20:32:32.747 回答
7

最好的方法是使用代理缓存(Squid、Varnish)并提供适当的 Cache-Control/Expires 标头以及 ETag:请参阅Mark Nottingham 的缓存教程以获取有关缓存如何工作以及如何充分利用的完整描述缓存代理的性能。

另请查看memcached,并尝试在其中缓存您的数据库查询(或者更好的是,预渲染页面片段)。

于 2008-09-10T20:26:23.853 回答
7

如果代理缓存是不可能的,并且您正在提供完整的 HTML 文件,那么您将通过完全绕过 PHP 获得最佳性能。研究WP Super Cache的工作原理。

未缓存的页面被复制到与您的站点具有相似 URL 结构的缓存文件夹中。在以后的请求中,mod_rewrite 会记录缓存文件的存在并提供它。其他 RewriteCond 指令用于确保评论者/登录用户看到实时 PHP 请求,但大多数访问者将直接由 Apache 提供服务。

于 2008-09-15T14:34:35.870 回答
4

我会推荐MemcachedAPC。两者都是内存缓存解决方案,具有非常简单的 API 和大量库。

这 2 个问题是您需要将它们安装在您的 Web 服务器或另一台服务器上(如果它是 Memcached)。

装甲运兵车

优点:
  • 简单的
  • 快速地
  • 也加快了 PHP 的执行速度
缺点
  • 不适用于分布式系统,每台机器都在本地存储其缓存

内存缓存

优点:
  • 快速(ish)
  • 可以安装在单独的服务器上供所有 Web 服务器使用
  • 高度测试,在 LiveJournal 开发
  • 被所有大人物(Facebook、雅虎、Mozilla)使用

    缺点:
  • 比 APC 慢

  • 可能的网络延迟
  • 配置略多

我不建议自己写,那里有很多。如果您无法在您的网络服务器上安装软件,您可以使用基于磁盘的缓存,但可能存在竞争问题需要处理。一个请求可能正在写入文件,而另一个请求正在读取。

您实际上可以缓存搜索查询,甚至几秒钟到一分钟。除非您的数据库每秒更新超过几次,否则有些延迟是可以的。

于 2008-09-12T05:31:45.250 回答
2

PHP Smarty 模板引擎 ( http://www.smarty.net ) 包括一个相当先进的缓存系统。

您可以在 Smarty 手册的缓存部分找到详细信息:http ://www.smarty.net/manual/en/caching.php

于 2008-09-10T23:34:15.537 回答
1

您似乎正在寻找 PHP 缓存框架。我向您推荐模板系统 TinyButStrong,它带有一个非常好的 CacheSystem 插件。它简单、轻便、可定制(你可以缓存你想要的 html 文件的任何部分),非常强大 ^^

于 2008-09-10T21:35:03.530 回答
1

页面或部分页面的简单缓存 - Pear::CacheLite 类。我还将 APC 和 memcache 用于不同的事情,但到目前为止我看到的其他答案更多的是用于更完整和更复杂的系统。如果您只需要节省一些精力来重建页面的一部分 - 带有文件支持存储的 Cache_lite 就完全足够了,而且实现起来非常简单。

于 2008-09-13T00:24:59.033 回答
0

Project Gazelle(一个开源 torrent 网站)提供了在网站上设置 Memcached 的分步指南,您可以轻松地在您可能想要设置的任何其他网站上使用它来处理大量流量。

获取源代码并阅读文档。

于 2008-09-13T01:25:51.400 回答