2011-06-29 43 views
4

我有一个网站是相当数据库密集型,所以我试图在可能的情况下减少数据库的使用。我想要做的一个地方是在我的论坛的每个线程上。从数据库生成静态HTML文件

每次查看时都不会动态生成每个线程,而是考虑生成每个线程的静态版本,每次创建新帖子时都会覆盖该静态版本。每个线程将存储在/ html/forum文件夹中,并且在3天或更多天内未被编辑的线程将被移动到/ html/forum/archive文件夹(因此file_exists不必搜索5000个html文件每次为常见的线程)。

这里是新线程页会是什么样一个粗略的例子:

require_once('header.php'); 
if(file_exists('/html/forum/'.$thread_id.'.html')) 
{ 
    require_once('/html/forum/'.$thread_id.'.html'); 
} 
elseif(file_exists('/html/forum/archive/'.$thread_id.'.html')) 
{ 
    require_once('/html/forum/archive/'.$thread_id.'.html'); 
} 
else 
{ 
    //display something about how the thread doesn't exist 
} 
require_once('footer.php'); 

论坛只是一个例子,但我想与广大的在我的网站的网页这样做。这种方法每次动态生成内容都有什么主要缺点或优点?

谢谢!

+4

唯一回答这个问题的方法是:做基准测试。找出哪种方法更有效率,并与之配合。 –

回答

2

像这样使用静态文件根本不是一个坏主意,但不要打扰归档子目录。相反,通过某个抽象值将缓存文件拆分为子类,如线程ID的最后一个数字或线程ID的md5()散列的前两个字符。所以你得到:

/1/121.html 
/1/301.html 
/2/92.html 
/3/13.html 

这将保持你的文件,每subdir下来。您可能要取决于如何可能你期望文件必须去更多的层次:

/2/1/121.html 
/0/1/301.html 
/9/2/92.html 
/1/3/13.html 

或者,你可能想要把这个静态内容变得像一个Memcache的 - 那么你将不必担心所有文件名,只是由线程ID索引。你甚至可以把内容放到你的SQL数据库中 - 至少在这种情况下,你只做一个单行查询而不是大连接。

3

我通常会坚持动态页面生成,因为如果你有一个10页的线程,你将不得不捕获大量触发缓存更新的事件。这些不仅限于新的职位。你必须捕获所有的职位CRUD操作。想象如果第1页的某些帖子被删除,缓存更新。此外,用户统计信息(帖子总数,在线状态等)通常对观众来说应该是新鲜的。所以我的观点是,表现的好处在这里是不值得的。