我有一个网站,基本上只显示没有任何形式和后期获取的东西。 该网站基于PHP并托管在共享主机上。它很少改变。 我想为这个网站启用缓存。 它的共享托管所以我需要一个解决方案:
基本上我想要实现的是将每个子网站缓存到HTML并告诉PHP获取当前子网站的HTML缓存版本5分钟并将其显示给用户。 5分钟后刷新缓存。
我一直在互联网上寻找一些时间,并且有一些教程和框架支持这种变态缓存。
但我需要的只是一个非常容易使用的好库。
我想它可以这样工作:
<?
if (current_site_cache_is_valid())
{
display_cached_version();
die;
}
..mywebsite rendering code
?>
听起来很简单,但我希望一些好的开发人员之前做过这种类型的库。那么你知道这样的准备使用,而不是非常耗费时间来实现解决方案吗?
答案 0 :(得分:5)
这就是我通常这样做的方式,但是我不知道你的网址设计和目录/文件布局。
我使用.htaccess
和mod_rewrite
Docs执行此操作。
网络服务器检查是否存在缓存的HTML文件,如果存在,则会传递。你也可以查看它的年龄。
如果它太旧或者它不存在,那么PHP脚本(s?)就会启动。在脚本的开头start the output bufferDocs。在脚本结束时,您将获得输出缓冲区,并将内容放入缓存文件,然后输出。
此解决方案的好处是,apache将提供静态文件,以防它们存在且无需调用PHP进程。如果你在PHP本身内完成所有工作,那么你将无法获得这样的好处。
我甚至更进一步,运行一个删除旧缓存文件的cron-job,而不是在.htaccess
内进行时间检查。完成后,您可以使重写不那么复杂,而不是.php.cached
文件而不是.php
文件。
答案 1 :(得分:3)
我有一个简单的算法用于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