2011-06-29 39 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頁的某些帖子被刪除,緩存更新。此外,用戶統計信息(帖子總數,在線狀態等)通常對觀衆來說應該是新鮮的。所以我的觀點是,表現的好處在這裏是不值得的。