CodeIgniter 是一套給 PHP 網(wǎng)站開(kāi)發(fā)者使用的應(yīng)用程序開(kāi)發(fā)框架和工具包嗤谚。 它的目標(biāo)是讓你能夠更快速的開(kāi)發(fā),它提供了日常任務(wù)中所需的大量類庫(kù)藏畅, 以及簡(jiǎn)單的接口和邏輯結(jié)構(gòu)敷硅。這是一個(gè)性能小巧且性能十分出色的框架,本文作為CI源碼分析的開(kāi)篇愉阎,將介紹框架代碼的組織結(jié)構(gòu)绞蹦,應(yīng)用程序的流程圖和從入口文件開(kāi)始源碼的執(zhí)行過(guò)程,為后續(xù)的代碼分析奠定基礎(chǔ)榜旦。
代碼結(jié)構(gòu)
目前CodeInniter的release版本是3.1.x幽七,從官網(wǎng)或者git下載代碼之后主要代碼目錄如下所示,本人閱讀的代碼的具體版本是3.1.8溅呢。
CI框架的主要文件目錄是application和system澡屡,當(dāng)然還有user_guide目錄猿挚。
application目錄顧名思義是應(yīng)用的主目錄,文件夾中包含應(yīng)用相關(guān)配置或擴(kuò)展類的模板驶鹉,開(kāi)發(fā)者使用框架進(jìn)行應(yīng)用開(kāi)發(fā)時(shí)主要在本目錄編寫(xiě)相應(yīng)的配置以及邏輯處理方法绩蜻。
system目錄是框架的系統(tǒng)庫(kù),包括公共函數(shù)室埋,基礎(chǔ)配置項(xiàng)办绝,核心類庫(kù),輔助類庫(kù)姚淆,數(shù)據(jù)庫(kù)等孕蝉,這些文件開(kāi)發(fā)者最好不要擅自修改,它是整個(gè)框架的根基也是做源碼分析需要最先關(guān)注的地方肉盹。
目錄名稱 | 注釋 |
---|---|
core | 核心庫(kù)和公共函數(shù) |
database | DB相關(guān)的工具類 |
fonts | 字體 |
helpers | 輔助函數(shù) |
langage | 語(yǔ)言提示工具 |
libraries | 實(shí)用類庫(kù) |
應(yīng)用程序流程圖
在CodeIngiter的用戶手冊(cè)中給出了如下圖所示的應(yīng)用程序流程圖昔驱,實(shí)際上已經(jīng)比較準(zhǔn)確的描述了CI框架的執(zhí)行過(guò)程,在下一篇分析文章框架啟動(dòng)器CodeIngiter.php的分析中我們也會(huì)從代碼的角度分析框架從請(qǐng)求到頁(yè)面顯示在瀏覽器上的執(zhí)行過(guò)程上忍,現(xiàn)在暫且對(duì)框架有個(gè)初步的認(rèn)識(shí)。
-
index.php
文件作為前端控制器纳本,初始化運(yùn)行 CodeIgniter 所需的基本資源窍蓝; - Router 檢查 HTTP 請(qǐng)求,以確定如何處理該請(qǐng)求繁成;
- 如果存在緩存文件吓笙,將直接輸出到瀏覽器,不用走下面正常的系統(tǒng)流程巾腕;
- 在加載應(yīng)用程序控制器之前面睛,對(duì) HTTP 請(qǐng)求以及任何用戶提交的數(shù)據(jù)進(jìn)行安全檢查;
- 控制器加載模型尊搬、核心類庫(kù)叁鉴、輔助函數(shù)以及其他所有處理請(qǐng)求所需的資源;
- 最后一步佛寿,渲染視圖并發(fā)送至瀏覽器幌墓,如果開(kāi)啟了緩存,視圖被會(huì)先緩存起來(lái)用于 后續(xù)的請(qǐng)求冀泻。
代碼執(zhí)行過(guò)程
和很多MVC框架類似常侣,CI框架的入口腳本也命名為index.php
。
index.php
完成的工作包括設(shè)置框架的執(zhí)行環(huán)境弹渔,具體為development
胳施,testing
,production
3種肢专,并根據(jù)執(zhí)行環(huán)境設(shè)置PHP的報(bào)警級(jí)別舞肆。
然后分別設(shè)置系統(tǒng)您没,應(yīng)用和視圖文件夾的名稱,并且定位這些文件夾在服務(wù)器的絕對(duì)路徑胆绊,然后定義BASEPATH
氨鹏,VIEWPATH
和APPPATH
3個(gè)常量。
最后压状,引入了真正貫穿CI執(zhí)行過(guò)程的“啟動(dòng)器”文件CodeIgniter.php
仆抵。
Tips:在CI框架的其他系統(tǒng)文件的首部我們都會(huì)發(fā)現(xiàn)如下所示的代碼段,這就表示index.php
是框架的唯一入口文件种冬,如果用戶試圖繞過(guò)入口文件index.php
通過(guò)其他方式訪問(wèn)其他文件會(huì)以錯(cuò)誤的方式跳出框架镣丑。
defined('BASEPATH') OR exit('No direct script access allowed');
從源碼的角度看整個(gè)框架的文件調(diào)用過(guò)程如下圖所示。
通過(guò)梳理代碼的執(zhí)行和調(diào)用過(guò)程娱两,我們至少基本了解了CI框架代碼的設(shè)計(jì)莺匠,那么我們接下來(lái)就從啟動(dòng)器
CodeIgniter.php
開(kāi)始入手分析框架運(yùn)行過(guò)程中核心庫(kù)的源代碼。