如何实现PHP / HTML缓存

时间:2009-05-06 11:20:18

标签: php html caching

我已经阅读了几个关于实现php缓存系统的指南(我的网站是自定义编码,相当严重且查询量很大),包括以下内容:http://www.snipe.net/2009/03/quick-and-dirty-php-caching/

我完全理解它们,但是我无法缓存页面的某些部分,这样做的最佳方法是什么?

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

为什么你不能缓存它们?如果是因为它们变化非常快,那么你最好不要试图减少检索和渲染开销。

如果内容因用户而异,则可以为每个用户提供不同的缓存版本。例如,如果您正在使用对象缓存,则在缓存键中包含用户的标识符或其他一些唯一值。如果您使用的是更通用的HTTP级缓存,例如Squid,那么您可以将Vary标头设置为,例如Vary: Cookie,这将导致代理人仔细检查其提供内容的对象。

您仍应指示缓存和代理不要将任何敏感信息存储在公共缓存中。

答案 2 :(得分:1)

请记住,缓存不是单一解决方案 - 您的应用程序可以在不同级别上进行缓存,具体取决于变量的范围。在单个请求中,您可能具有身份映射以防止对相同数据的其他查询。您可以使用memcached在请求之间缓存数据。数据库本身具有查询缓存以及其他类型的低级缓存。您的渲染引擎也可以在不同的级别缓存 - 整个页面,页面的各个部分等。您需要弄清楚可以缓存的内容并为此制定策略。

此外,与所有优化一样,请确保在调整任何内容之前进行测量。这将确保1)你实际上改善了事情,而不是让事情变得更糟; 2)你专注于重要的事情,而不是其他所有事情。

答案 3 :(得分:0)

这是我的提示:创建一个对象或函数,允许您根据其名称缓存“部分”。这样,您可以缓存部分页面,并在if块中包含渲染部分。我所做的是对输入文本进行散列并将其用作'./cache'中的文件名,并返回是否需要重新生成的布尔值;你显然需要输出缓冲。

这将为您提供一个缓存框架,

if(Cache::cached('index-recent-articles', 5 /* minutes */)) {
   Cache::start();
   echo 'stuff here';
   Cache::stop('index-recent-articles');
} // And if Cache::cached could echo the cached HTML when the result is false...
  // then this is a tidy else-less bit of code.

我不知道这是否是最优的,像memcache这样的基于服务器的解决方案会更好,但这个概念应该对你有帮助。显然,您是如何通过文件或数据库或扩展来管理缓存的。

编辑:

如果您希望进行基于文件的缓存,那么这个简单的系统可能就是您所需要的。显然我还没有用你的鞋测试它,这大部分只是从我的后脑中拉出来的,但是就目前而言,这是你想要的一个不错的开始。

abstract class Cache {
  const path = 'cache/';
  static function start()  { ob_start(); }
  static function end($id, $text = null) {
    $filename = sprintf('%s%u', Cache::path, crc32($id));
    file_put_contents($filename, $text === null ? ob_get_clean() : $text);
  }
  static function cached($id, $minutes = 5) {
    $filename = sprintf('%s%u', Cache::path, crc32($id));
    $time = $minutes * 60;
    if(time() - filemtime($filename) > $time) {
      return true;
    } else {
      echo file_get_contents($filename);
      return false;
    }
  }
}