CodeIgniter是一個小巧優雅的php開源架構,遵循MVC模式,相容php4、php5版本,目前CI的最新版本是1.7.3,本文旨在描述CI的從用戶端請求到渲染結束的工作過程。
cache用以儲存快取檔案,codeigniter檔案夾包含了CI的基類CI_Base,為了相容php4和php5,CI_Base有兩個版本,其中php4版本的CI_Base繼承於CI_Loader。libraries裡存放了大部分常用的類庫,最主要的三個類:Model,View和Cotronller,自己寫的任何mvc都要繼承於已有的mvc類;helpers裡是一些函數(方法)集合,用以輔助其他模組的方便工作。language是一個語言套件,用以支援多語言。
application檔案夾用以儲存您的應用程式,CI已經在內部為您增加了一些子檔案,包括models、views、controllers、config、errors、hooks和libraries。其中前三個檔案夾是用以建立模型、視圖和控制器的。您的大部分工作都應該是建立屬於自己的MVC,並可在config裡加入設定檔,libraries裡加入一些對象和方法,用來輔助您的模型和控制器工作。而hooks也是對CI_Hooks的擴充,具體內容見下面的章節。
當有一個http請求時,如http://www.mysite.com/blog/view,首先進入CI的引導檔案index.php。接下來我們看看index.php裡做了哪些事情。
index首先設定了應用程式的檔案夾名稱為application,系統的檔案夾名稱為system,然後做了一系列嚴格的判斷並轉換為unix風格的伺服器絕對檔案路徑,具體說來定義了兩個比較重要的常量,APPPATH,應用程式的檔案夾路徑,根據分析可知,該路徑可以和system同級:htdocs/application/,也可以放到system檔案夾裡面,作為其子檔案夾:htdocs/system/application/,但推薦採用第二種方式,這樣顯得比較整齊;BASEPATH,網站文檔的基本檔案路徑,寫出來大概是htdoc/system/;到最後,index引導檔案引入了codeigniter/codeigniter.php裡。接下來我們看看codeigniter裡做了什麼事情。
codeigniter.php一上來就引入了三個檔案:Common.php,Compat.php和config/constants.php,其中Common裡包含了一些函數,用於載入類庫的load_class,記錄日誌的log_message,和引入錯誤頁面的show_404是幾個重要的函數;Compat主要解決了php4和php5中的函數不相容問題,而constants則定義了一些讀寫檔案許可權的常量。
緊接著codeigniter載入了第一個類庫,Benchmark,這個類庫最簡單的一個應用就是計算網頁從開始到編譯結束所花掉的時間,所以您在編譯開始的地方打上一個標記,渲染結束後再打上一個標記,就可以算出其中花費的時間了。
接著載入了第二個類庫,Hooks,這個類庫和Benchmark一樣都是在system\libraries下,這個類庫的作用是在程式開始編譯之前給您提供一個執行其他事情的機會,Hooks會您執行其他任務提供了大約8個機會,具體參見使用者指南。在這裡,它匯入了第一個鉤子。
然後分別載入了Config,URI,Router,Output等類庫,接著,檢查是否有cache_override的鉤子,這個鉤子可以允許您調度自己的函數來替代Output類的_display_cache方法,如果沒有,直接調用Output的_display_cache,檢查是否有緩衝內容,如果有,則直接輸出緩衝,退出;如果沒有,則接著往下執行。
此後,繼續載入Input,Language,注意此前載入的類庫都是一個引用;然後又一個重要的載入,那就是CI_Base對象的載入,首先會判斷php的版本,如果是php4版本的,則會首先載入Loader,然後載入Base4,因為Base4中CI_Base繼承於CI_Loader,而Base5中,CI_Base與CI_Loader沒有繼承關係。
下一步,也是真正關鍵的一步了,這一步開始載入了一個Controller類,這個是個執行個體,而不是引用;然後通過Router來解析http地址,獲得控制器和方法的名字,接著看application\controllers裡是否存在這樣的控制器和方法,如果沒有,則報錯;如果有,則開始判斷。
To Be Continue~