內容發布系統的開發

來源:互聯網
上載者:User
  在網站流量很大的時候,為了提高系統效能,減短系統回應時間,我們很多時候考慮把網站做成靜態,用背景發布系統發布出來。靜態頁面在效能上具有不少優勢,但是,相對動態網頁面靈活性不夠,擴充性不好,以後維護起來也比較麻煩。下面,就我的經驗談談怎樣產生這些靜態網站。
  產生靜態頁面一般來說都是做好靜態頁面的模板,然後從資料來源讀取資料,產生html代碼塊替換模板中的標籤,然後產生靜態檔案。比如文章頁面模板部分如下:
  

<table border="1" style="BORDER-COLLAPSE: collapse" width="100%" cellpadding="2" cellspacing="2">
<tr>
<td>
<a href="(#ArticleUrl#)">(#Title#)</a>
<br>作者(#Author#) 時間2006-3-24 13:38:00
</td>
</tr>
<tr>
<td>
摘要:(#Description#)
</td>
</tr>
<tr>
<td>
(#Content#)
</td>
</tr>
</table>

  我們可以用如下的方法讀取該模板的內容
 

/// <summary>
/// 讀取檔案內容
/// </summary>
/// <param name="strFilePath">檔案路徑</param>
/// <returns>檔案內容字串</returns>
/// <param name="strEncodingName">編碼名稱(GB2312,UTF-8等)</param>
public string ReadFile(string strFilePath, string strEncodingName)
{
string strFile = string.Empty;
StreamReader sr = new StreamReader(strFilePath, System.Text.UnicodeEncoding.GetEncoding(strEncodingName));
try

strFile = sr.ReadToEnd();
}
catch(Exception e)
{
}
finally
{
sr.Close();
}
return strFile;
}

  假設返回的字串是strTemplate,從資料庫中讀取的文章標題為strTitle,作者為strAuthro,發布時間為strPostTime,描述為strDescription,內容為strContent,我們就可以用string的Replace方法把標籤替換為實際要顯示的內容了strArticle = strTemplate.Replace("(#Title#)", strTitle);
strArticle = strArticle.Replace("(#Author#)", strAuthor);
    ……………………………………

  這樣,strArticle就是要顯示頁面的html代碼了,再用如下的方法寫入檔案/// <summary>
/// 寫Html檔案
/// </summary>
/// <param name="strHtml">寫入的字串</param>
/// <param name="strDestinationFilePath">目的檔案路徑</param>
/// <param name="strEncodingName">編碼名稱(GB2312,UTF-8等)</param>
public void WriteFile(string strHtml, string strDestinationFilePath, string strEncodingName)
{
StreamWriter sw = new StreamWriter(strDestinationFilePath, false, System.Text.UnicodeEncoding.GetEncoding(strEncodingName));
try
{
sw.Write(strHtml);
sw.Flush();
}
catch(Exception e)
{
strErrorMessage = e.Message.ToString();
}
finally
{
sw.Close();
}
}

  這裡要注意的是Replace方法有時候替換會失效,比如<a href="http://(#UserID#).it.com.cn">one</a>這裡的(#UserID#)不能用Replace方法替換,可以這樣來替換strArticle = Regex.Replace(Article, "\\(#UserID#\\)", strUserID);
  現在,產生靜態檔案的方法我們會了,再來看看一些個人化技巧,如何給使用者提供不同風格的各種頁面。
  現在一般是通過div+css的方法給每個使用者提供不同風格的頁面。也就是說每個使用者頁面的html代碼結構是一樣的,只是外部css不一樣,這樣在寫頁面的時候,我們可以把基本的html代碼寫入程式碼到我們的程式中,減少了複雜度。css可以很好的控制頁面配置,實現起來很方便。這種方法中,所有風格的同一頁面模板只有一個,一個風格對應一個css檔案。這樣,可以滿足一般的需求了,很多的blog都是採用這種方法來實現,比如blogcn,douban。
  但是,這種方法也有個缺陷,因為html代碼是寫入程式碼到後台代碼中,所有風格的同一頁面模板只有一個,所以頁面的個人化也受到了一定限制。比如我想讓一個風格的文章列表用表格形式,另一個採用其他方式,就無法實現了,因為我們已經把具體內容寫在後台代碼中了,只是引用的css檔案不同。只要我們稍加改進,就完全可以隨心所欲定製頁面了,我的方法如下:
  每個風格一套模板,一個css。比如文章頁面的另一個風格模板如下:<div>
<a href="(#ArticleUrl#)">(#Title#)</a>
<br>作者(#Author#) 時間2006-3-24 13:38:00
<hr>
摘要:(#Description#)
<br>(#Content#)
<div>

  同樣,我們也可以用上面替代的方法產生頁面,只是每次要根據使用者所選擇的模板來選擇不同的模板檔案,而不是所有的使用者選擇同一個。看到這裡,你可能會問,那要是列表怎麼辦?以前是把列表的html代碼直接寫在後台代碼中,現在呢?遇到這樣的情況,我們可以做下面這樣的模板。<table>
<!-- ArticlesList Start -->
<!-- Article (#ArticleID#) Start -->
<tr>
<td height="20"></td>
</tr>
<tr>
<td>
<table border="1" style="BORDER-COLLAPSE: collapse" width="100%" cellpadding="2" cellspacing="2" ID="Table2">
<tr>
<td>
<a href="(#ArticleUrl#)">(#Title#)</a>
</td>
</tr>
<tr>
<td>
摘要:(#Description#)
</td>
</tr>
<tr>
<td>
發表於(#ReleaseTime#)&nbsp;|&nbsp;評論((#CommentCount#))&nbsp;|&nbsp;訪問((#VisitCount#))
</td>
</tr>
</table>
</td>
</tr>
<!-- Article (#ArticleID#) End -->
<!-- ArticlesList End -->
</table>

  上面的模板中<!-- Article (#ArticleID#) Start -->和<!-- Article (#ArticleID#) End -->之間的內容就是文章列表中一個文章的代碼,我們只需要用Regex把這部分找出來,替換標籤就得到了一個列表中一個文章的html代碼,把所有文章的代碼連起來就得到了文章列表的代碼,再讓得到的代碼替換模板中<!-- ArticlesList Start -->和<!-- ArticlesList End -->的內容就得到了最終要寫入頁面的代碼。雖然比以前div+css的方式多了些步驟,但是,這樣確實有效可行。大家也許會發現,上面的模板也為某些更新頁面而不需要讀資料庫提供了基礎,比如我要從文章列表中刪除ID為100的文章,我們只要刪除<!-- Article 100 Start -->和<!-- Article 100 End -->之間的內容就可以了,根本不需要再讀資料庫。但是,這樣也會帶來隱患,假如某次檔案操作失敗,那就永遠是失敗,不能跟資料庫的內容同步,當然你可以通過提供其他功能來解決這個問題。
  既然是為了效能,我們把頁面發布成靜態,那我們不如再進一步,看看怎樣提高寫靜態頁面的效能。
  1.提取所有頁面的公用部分,放外部檔案進行引用。
  比如所有頁面的導航部分是相同的,這些部分經常要根據使用者的操作進行更新,如果把它完全寫在每個頁面中,更新起來代價是很大的,必須重寫每個頁面。我們可以把這些內容外掛到js中,更新這些內容的時候,更新相應的js檔案就可以了,一次更新,整站更新。這裡,要注意的是要對js的特殊字元要進行轉義,比如;'"等特殊字元要在前面加上/進行轉義。
  2.局部更新,而不是整體更新
  我們可以用<!-- ArticlesList Start -->和<!-- ArticlesList End -->這樣的標記把文章列表標記出來,更新文章頁面的時候,我們只需要產生文章列表html代碼,代替原頁面(非模板)這兩個標記之間的內容就可以了。這樣,能大量減少讀資料庫的次數,效能自然也提高不少。在不同內容越多的頁面,效能優勢越明顯。
  3.使用分層樹結構存放檔案
  這個其實是對讀取效能的最佳化了。我們不要把大量的檔案都產生在同一個根目錄下,這樣伺服器遍曆檔案就會影響效能。我們可以使用分層樹結構來組建檔案,比如按年/月/日的形式組織檔案目錄。
  綜合有目的性的使用以上方法可以提高發布系統的效能,也能使使用者介面最大限度地個人化。有時,我們可以採用靜態和動態結合的方法提高系統效能,比如文章列表第一頁產生靜態,後面的採用動態方式。總之,對訪問頻率越高的頁面產生靜態越有優勢,更新頻率越高的頁面動態方式越有優勢,所以我們要均衡兩者,有的放矢的選擇。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.