摘要:內容管理系統(CMS)在各大商業站點和門戶站點中扮演着重要的角色,是內容有效組織和快速發佈極爲重要的基礎平臺。目前主流的內容發佈系統都使用靜態頁面進行內容發佈,在咱們的實際使用過程當中咱們深切的感覺到靜態內容發佈存在着不少弊端,本文討論全搜索目前正在使用的基於動態可緩存內容發佈系統的考慮和實現。php
1、什麼是內容管理系統?html
內容發佈系統也即CMS,英文全稱爲:Content management system,用於對企業業務數據進行組織、管理和發佈,這裏的內容不只僅指文字內容,還包括圖片、聲音、視頻、Flash等富媒體資源,CMS的應用極大的提升了站點的建設效率並下降了維護成本。目前市面上的CMS種類繁多,開源的內容管理系統主要有:前端
PHP:java
國內PHPCMS,VeryCMS,DeDeCMS,EmpireCMS,HBCMS數據庫
國外:Mambo,Joomla!,XOOPS,Drupal後端
更多見:http://www.php-open.com/9.htm緩存
Java見http://www.open-open.com/39.htm服務器
ASP主要考察使用過風訊,對其它ASPCMS感興趣的能夠查看這篇文章運維
http://hi.baidu.com/liberty88/blog/item/56e147fbd8271a176c22eb0e.htmlmemcached
商業CMS主要有:方正翔宇CMS,北方網CMS和TRS WAS,其中方正翔宇CMS在媒體行業應用很是普遍,TRS在政府部門應用很是普遍,北方網CMS在一些媒體網站中也有些應用。
就目前的整體狀況來看,開源類CMS和商業類CMS還存在很大的差距,商業CMS在工做流,權限控制,內容的編採發以及系統的性能,擴展和可維護性上已經很是成熟和完善;對比開源CMS,則在這些方面存在很大的差距。因爲我的以爲國外的CMS不太符合國人的使用習慣和國情,因此對他們研究的比較少也不太清楚他們在國內的應用狀況,就國內的CMS而言目前也尚未看到較大規模應用的案例(若是有請告訴我),我透露幾個目前已知的商業CMS內容發佈系統的應用狀況關鍵性能指標,最大數據量千萬級,同時最高終端用戶數500,發佈時間1-2秒,每日更新1萬-2萬篇內容,相關內容自動更新。總之,開源CMS要走的路還長。
2、什麼是動態可緩存的內容管理系統?
動態可緩存的內容管理系統是指前臺頁面動態解析執行而且動態解析執行的頁面可被客戶端和代理服務器進行緩存從而達到和生成靜態頁面一樣的執行性能和效果的管理系統。
3、爲何使用動態可緩存的內容管理系統?
第一節面提供的內容發佈系統包括商業類CMS基本都是以生成靜態頁面的方式進行內容發佈,咱們早期的系統也所有使用靜態靜態頁面進行內容發佈,在咱們的實際使用過程當中,生成靜態頁面的方式給咱們帶來了不少麻煩,主要有下面幾個問題:
一、在設計、開發上,使用靜態頁面進行發佈,系統須要不少額外的設計和開發,以靜態頁面的方式進行發佈,涉及到生成規則,更新規則,發佈規則等方方面面的事務,特別是當系統對內容的發佈和更新有苛刻的性能要求時,這些規則更是須要進行仔細的設計和權衡。使用靜態頁進行發佈主要是考慮到系統的執行性能,我固然贊成靜態頁的執行性能是很高的,可是多數系統卻遠遠大不到預想的訪問量而引入了高度的系統複雜,也並不是是系統一開始就有巨大的訪問量,我也不認同動態執行頁面就沒法承受大訪問量的說法,其實我看到的大多數CMS中都沒有對靜態頁的處理規則進行很好的設計,好比:常常是在後臺撤銷了內容發現原始html沒有刪除,內容依然能夠訪問或者一篇內容更新時,相關引用的內容沒法作到關聯更新;靜態發佈方式並非那樣容易的,相反我以爲動態發佈更容易開發和維護。
二、在系統維護上,生成的靜態頁面會佔用很大的磁盤空間,咱們全部的靜態頁面加起來應該有100-200個G了。這樣龐大的數據量備份,恢復都是很麻煩的,無形之中給系統的運維工做增長了很大的難度,但實際上CMS有個顯著的特色就是發佈多,修改少,越早的數據越少被訪問,應該說這100,200個G的數據中有99%以上的數據是有效期事後不多或再也沒被訪問過的,因此磁盤幾乎是白白的被浪費了。
因此,在咱們的實際使用過程當中咱們更傾向於動態內容執行+多重cache的方式,新的系統中咱們是這樣作的,最後完成的系統很是簡單並在Squid的幫助下達到靜態頁面的執行性能。
4、如何實現動態可緩存的內容管理系統?
(可緩存的內容管理系統用戶訪問流程)
實現過程:
1. 全部前臺頁面使用URL rewrite重寫成.html進行訪問,方便搜索引擎收錄。
2. WEB程序執行時,向Squid服務器發送Expires頭,用於控制squid服務器的緩存時間。Expires用戶設置Squid服務器和客戶端的緩存時間。如:
PHP
php代碼
header("Expires:" . gmdate("D, d M Y H:i:s", time() + 120). "GMT"); //緩存120秒
Java
java.text.SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "GMT")); format.setCalendar(cal); java.util.Date expires = format.parse(format.format(new Date(System.currentTimeMillis() + 120 * 1000))); response.setHeader('Expires: ' + expires);
3. 配置Squid服務器指向源服務器,並配置ignore-reloa來忽略no-cache和reload請求以提高Squid的命中率。
4. 將最新最熱的數據緩存到Memcached服務器,減小數據庫的查詢。
至此整個過程已經完成,早期系統的訪問量通常比較小,這時候可直接將WEB服務器對外提供服務,因爲CMS所管理內容發佈快,修改少的特性,最新最熱的內容都將在Memcached中命中;當訪問量增長到必定程度的時候就能夠在前端加上squid服務器,這樣就實現了和靜態頁面同樣的效果,同時也兼備了系統的可維護性和靈活性。咱們的全搜索首頁,母嬰頻道,娛樂頻道使用這種方法實現得到了很好的效果。
5、擴展
使用squid做爲前端時,過時時間的設置就變得很是重要,若是設置得太長用戶就很容易看到過時內容,若是設置得過短又下降了命中率不能有效發揮前端緩存的優點。那過時時間應該設置爲多長比較合適呢?一般狀況下首頁的更新頻道很高,內容頁更新的頻率較低,因此首頁的過時時間應該設置得短一些,內容頁能夠設置的長一些。
新浪
新浪首頁60秒過時,內容頁120秒過時
搜狐
搜狐首頁70秒過時,內容頁120秒過時
163
163首頁80秒過時,內容頁120秒過時
通過測試成都全搜索的系統裏首頁設置60秒過時,內容頁設置120秒過時,這樣的設置通過長時間的運行沒有收到任何編輯和用戶的不良使用反饋,這樣的設置使得每隔60秒鐘首頁去原始服務器執行一次;每隔120秒對內容頁去原始服務器執行一次。因爲後端使用memcached做爲緩存,即便是突發流量也能夠輕鬆自如的應對。
學習資料:
出處:http://www.cnblogs.com/codecrazy/archive/2010/10/15/1851933.html