超简单的基于静态文件(html)的php网站缓存

时间:2012-01-06 12:54:22

标签: php html caching shared-hosting

我有一个网站,基本上只显示没有任何形式和后期获取的东西。 该网站基于PHP并托管在共享主机上。它很少改变。 我想为这个网站启用缓存。 它的共享托管所以我需要一个解决方案:

  • 不使用Memcached
  • 无需将我的网站移至VPS
  • 不要使用APC或其他东西

基本上我想要实现的是将每个子网站缓存到HTML并告诉PHP获取当前子网站的HTML缓存版本5分钟并将其显示给用户。 5分钟后刷新缓存。

我一直在互联网上寻找一些时间,并且有一些教程和框架支持这种变态缓存。

但我需要的只是一个非常容易使用的好库。

我想它可以这样工作:

<?

if (current_site_cache_is_valid())
{
   display_cached_version();
   die;
}

..mywebsite rendering code

?>

听起来很简单,但我希望一些好的开发人员之前做过这种类型的库。那么你知道这样的准备使用,而不是非常耗费时间来实现解决方案吗?

5 个答案:

答案 0 :(得分:5)

这就是我通常这样做的方式,但是我不知道你的网址设计和目录/文件布局。

我使用.htaccessmod_rewrite­Docs执行此操作。

网络服务器检查是否存在缓存的HTML文件,如果存在,则会传递。你也可以查看它的年龄。

如果它太旧或者它不存在,那么PHP脚本(s?)就会启动。在脚本的开头start the output buffer­Docs。在脚本结束时,您将获得输出缓冲区,并将内容放入缓存文件,然后输出。

此解决方案的好处是,apache将提供静态文件,以防它们存在且无需调用PHP进程。如果你在PHP本身内完成所有工作,那么你将无法获得这样的好处。

我甚至更进一步,运行一个删除旧缓存文件的cron-job,而不是在.htaccess内进行时间检查。完成后,您可以使重写不那么复杂,而不是.php.cached文件而不是.php文件。

答案 1 :(得分:3)

我有一个简单的算法用于HTML缓存,基于以下条件

  • 用户是访客(已登录用户设置了blog_user Cookie)
  • 请求URI是不包含请求参数的GET
  • 存在该文件的HTML缓存版本

然后启动.htaccess重写规则,将请求映射到缓存文件。假设其他任何内容都是特定于上下文的,因此不可缓存。请注意,我为我的博客使用维基百科式URI映射,因此/article-23在未缓存时会映射到/index.php=article-23

我在DOCUMENT_ROOT目录中使用单个HTML访问文件,这是相关的摘录。这是第三个重写规则,可以满足您的需求。任何生成可缓存O / P的脚本都会将其包装在ob_start() ob_get_clean()对中并写出HTML缓存文件(尽管这全部由我的模板引擎处理)。更新还会根据需要刷新HTML缓存目录。

RewriteEngine on
RewriteBase /

# ...
# Handle blog index
RewriteRule ^blog/$                                    blog/index               [skip=1]

# If the URI maps to a file that exists then stop.  This will kill endless loops

RewriteCond %{REQUEST_FILENAME}                        -f
RewriteRule ^blog/.*                                   -                        [last]

# If the request is HTML cacheable (a GET to a specific list, with no query params)
# the user is not logged on and the HTML cache file exists then use it instead of executing PHP

RewriteCond %{HTTP_COOKIE}                             !blog_user
RewriteCond %{REQUEST_METHOD}%{QUERY_STRING}           =GET                     [nocase]
RewriteCond %{DOCUMENT_ROOT}/blog/html_cache/$1.html   -f
RewriteRule ^blog/(article-\d+|index|sitemap.xml|search-\w+|rss-[0-9a-z]*)$ \
                                                       blog/html_cache/$1.html  [last]

# Anything else relating to the blog pass to index.php
RewriteRule blog/(.*)                                  blog/index.php?page=$1   [qsappend,last]

希望这会有所帮助。我的博客更详细地描述了这一点。 :-)

答案 2 :(得分:2)

自从你提出这个问题已经有一段时间了,但由于这仍然在搜集热门搜索,我认为我会给你一个更好的答案。

你可以在没有.htaccess或其他技巧的情况下在PHP中进行静态缓存。我在http://simonwillison.net/2003/may/5/cachingwithphp/找到了这个:

<?php
$cachefile = 'cache/index-cached.html';
$cachetime = 5 * 60;
// Serve from the cache if it is younger than $cachetime
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
    include($cachefile);
    echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n";
    exit;
}
ob_start(); // Start the output buffer

/* The code to dynamically generate the page goes here */

// Cache the output to a file
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush(); // Send the output to the browser
?>

答案 3 :(得分:2)

只需为nico的响应添加更多内容,通过节省为每个保存的文件输入单个缓存文件名称的时间,使其对通用复制和粘贴使用更有用。

原件:

$cachefile = 'cache/index-cached.html';

修改:

$cachefile = $_SERVER['DOCUMENT_ROOT'].'/cache/'.pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_FILENAME).'-cached.html';

这样做的目的是获取它所在文件的文件名,减去扩展名(在我的例子中为.php),然后附加&#34; -cached.html&#34;标签和缓存文件的新扩展名。可能有更有效的方法来做到这一点,但它对我有用,并希望为他人节省一些时间和精力。

答案 4 :(得分:1)

您应该尝试skycache编辑:这个项目看起来也很酷:cacheme

另一种解决方案是使用auto_prepend_file / auto_append_file。类似于本教程中描述的内容:Output caching for beginners