此次是逆雪寒對index.php的分析:php
1 /* 2 [/php] 3 4 [ 本帖最後由 逆雪寒 於 2007-12-25 16:12 編輯 ] 5 6 7 儘可能天天都有新的東西天天都能進一小步 8 9 如今開始講 index.php 首頁文件. 基原本說PHPCMS的加載到顯示操做的整個流程都分析完了. 10 你們看一遍後.還要總體的來看來分析.慢慢體會.把些好的思想和思路實現到本身之後的項目裏. 11 我相信你們都會變得很強的. 記得: 程序是死的,人是活的.有實現思路一切都好辦了. 12 13 [php] 14 <?php 15 /* 16 代碼分析版權全部:逆雪寒 17 */ 18 19 /* 20 看 common.inc.php 核心啓動文件咱們已經講解完了。應該都明白了吧 21 */ 22 require './include/common.inc.php'; 23 24 /* 25 phpcms 容許在後臺生靜態和使用靜態,這裏就是先判斷 $PHPCMS['ishtml'] 26 (從文本緩存弄過來的。應該知道了吧)是否爲1 就是開啓了。和這個 靜態的html文件是否存在。 27 */ 28 if($PHPCMS['ishtml'] == 1 && file_exists(PHPCMS_ROOT.'/'.$PHPCMS['index'].'.'.$PHPCMS['fileext'])) 29 { 30 header('location:'.$PHPCMS['index'].'.'.$PHPCMS['fileext']); 31 32 exit; 33 } 34 35 $channels = array(); 36 37 $channels['article'] = $channels['down'] 38 = $channels['picture'] 39 = $channels['info'] 40 = array(); 41 42 // 獲取頻道模塊的信息。都是從緩存中取的 43 foreach($CHANNEL as $v) 44 { 45 $module = $v['module']; 46 47 if($v['islink'] == 0 && $MODULE[$module]['iscopy'] == 1) 48 { 49 $channels[$module][$v['channelid']] = $v; 50 } 51 } 52 53 // 這個是網頁的SEO (title,keywords,description)信息。這個寫好了。網絡蜘蛛會找你哦。 54 $head['title'] = $PHPCMS['seo_title']; 55 56 $head['keywords'] = $PHPCMS['seo_keywords']; 57 58 $head['description'] = $PHPCMS['seo_description']; 59 60 /* 61 * template() 函數是模板函數。這個就是這章的主題。往下會講模板引擎的製做,你們都看到include 了吧。 62 * 它的參數是文件地址。那麼就能夠想到 template()函數其實就是模板編譯後的PHP文件地址。 63 */ 64 include template('phpcms', 'index'); 65 66 /* 67 這個函數厲害了。用來自動生緩存頁的(這個是頁面緩存和數據庫信息的文本緩存不是一回事),頁面緩存, 68 就是把你所看的頁自動生成 XX.html 靜態頁。請注意前面代碼。是否是有個 header()跳轉到靜態頁呀。 69 那靜態頁那裏來的?就是給這個函數弄出來的。自動靜態化了其實。@@是否是很簡單呢。上菜先: 70 */ 71 /* 72 首先判斷。文件當前文件不是JS問文件和後臺打開了頁面緩存靜態化,。而後使用了OB讀寫緩衝區系列函數來操做緩衝區。 73 ob_get_clean() 函數。十分有用。通常咱們作整站靜態化也是利用OB系列函數來實現。 74 這個函數就是獲取當前緩衝區的HTML內容。而後把將要輸出的緩衝區內容清除掉。網頁先是一點點讀到瀏覽器的緩衝區。 75 當緩衝區滿了之後纔會放出來。因此咱們 76 能夠用OB系列函數在緩衝區沒有輸出以前截取內容來作咱們要作的過濾等動做。(dz的僞靜態有部分就這樣實現的。 77 把緩衝區中的全部超級鏈接地址更改爲:thread-46695-1-3.html 形式。而後apache 那邊再用.hataccess 來作判斷跳轉) 78 這裏也是。咱們獲取將要輸出的內容之後 調用 strip_js() 這個函數來過濾HTML內容。 由於比較簡單繼續上菜: 79 */ 80 function phpcache($is_js = 0) 81 { 82 global $CONFIG, $cachefiledir, $cachefile; 83 84 if(!$is_js && $CONFIG['phpcache'] != '2') { 85 return FALSE; 86 } 87 88 $contents = ob_get_clean(); 89 90 if($is_js) { 91 $contents = strip_js($contents); 92 } 93 94 if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile) 95 { 96 dir_create($cachefiledir); 97 file_put_contents($cachefile, $contents); 98 @chmod($cachefile, 0777); 99 } 100 101 // 告訴瀏覽器此頁面的過時時間(用格林威治時間表示),只要是已通過去的日期便可 102 header('Expires: Mon, 26 Jul 2000 05:00:00 GMT'); 103 104 // 告訴服務器本頁最後修改日期。目的就是強迫瀏覽器獲取最新資料 105 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); 106 107 // 這句 session_cache_limiter('private') 做用差很少。 108 // 就是用戶 點擊後退不會出現警告頁。十分有用哦。你們別忘了 109 header('Cache-Control: no-cache, must-revalidate'); 110 111 // 不緩存當前頁 。其實和前一句同樣意思,這句不過是爲了兼容http1.0協議。 112 header('Pragma: no-cache'); 113 114 // 輸出內容。 115 echo $contents; 116 } 117 phpcache(); 118 119 /* 120 主要是來過濾內容裏面的 \n 換行 、\r 換頁符 和 '\' 具體請百度:製表符 121 繼續咱們上個函數strip_js過濾完內容後。 在使用 file_put_contents() 函數 把內容寫到文件裏面去。 122 也就是那個 HTML靜態頁,恩完成了。當前頁的靜態頁已經存在了。 123 但好象不對是吧。由於你剛用了 ob_get_clean() 函數。截取內容後清空了輸出的內容。 124 那就是瀏覽器成了空白頁了。因此咱們要手動的來 echo 輸出內容給客戶看。echo 前呢 125 還有些東西要作就是 header 幾個http協議頭過去 註釋已經給出。詳細的百度:http協議, 126 會有詳細的參數說明 。其主要目的是:強制用戶每次訪問這個頁面時獲取最新資料,而不是使用存在客戶端的緩存。 127 */ 128 function strip_js($string, $js = 1) 129 { 130 $string = str_replace(array("\n","\r","\""),array('','',"[url=]\\\""),$string[\url]); 131 return $js == 1 132 ? "document.write(\"".$string."\");\n" 133 : $string; 134 } 135 136 /*