从数据库生成静态HTML文件

时间:2011-06-29 21:27:04

标签: php mysql

我有一个数据库密集的网站,所以我试图尽可能减少数据库的使用。我想要做的一个地方是我论坛的每个帖子。

我不是每次查看时动态生成每个线程,而是考虑生成每个线程的静态版本,这些版本会在新帖子生成时被覆盖。每个线程都将存储在/ html / forum文件夹中,未经过3天或更长时间编辑的线程将被移动到/ html / forum / archive文件夹(因此file_exists不必搜索5,000 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');

论坛只是一个例子,但我正在考虑使用我网站上的大多数页面来做这件事。这种方法在每次动态生成内容时是否存在任何主要缺点或优点?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

这会使您的每个子文件保持不变。您可能希望更多级别,具体取决于您希望文件的格式:

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

或者,您可能希望将此静态内容放入类似Memcache的内容中 - 然后您根本不必担心文件名,只需按线程ID索引即可。您甚至可以将内容放入SQL数据库中 - 至少在这种情况下,您只进行一次单行查询而不是大型连接。