摘 要 本文提出和實(shí)現(xiàn)一種基于MVC設(shè)計(jì)模式的模塊化、插件化輕量級(jí)PHP框架,適合團(tuán)隊(duì)開(kāi)發(fā),能極大地降低學(xué)習(xí)成本。開(kāi)發(fā)人員通過(guò)簡(jiǎn)單配置實(shí)現(xiàn)模塊、插件的按需加載,保證系統(tǒng)的運(yùn)行效率,并能通過(guò)繼承和拓展實(shí)現(xiàn)快速開(kāi)發(fā)。
關(guān)鍵詞 PHP框架 輕量級(jí) 模塊化 插件化
1 MVC設(shè)計(jì)模式
MVC是一種軟件設(shè)計(jì)模式,它強(qiáng)制性使應(yīng)用程序的輸入、處理和輸出分開(kāi),分解成模型、視圖、控制器3種部件,它們各自處理自己的任務(wù),如圖1所示。
視圖(View)是用戶(hù)看到并與之交互的界面。模型(Model)用來(lái)表示數(shù)據(jù)和業(yè)務(wù)規(guī)則,數(shù)據(jù)的處理、邏輯和功能的計(jì)算??刂破鳎–ontroller)用來(lái)接受用戶(hù)的操作并調(diào)用模型和視圖完成用戶(hù)的需求。
圖1:MVC工作流程圖
使用MVC模式開(kāi)發(fā)的優(yōu)點(diǎn)主要有加快項(xiàng)目的開(kāi)發(fā)效率、增強(qiáng)項(xiàng)目的可維護(hù)性、有利于軟件工程化管理。
2PHP開(kāi)發(fā)框架現(xiàn)狀
所謂框架就是通過(guò)提供一個(gè)開(kāi)發(fā)程序的基本架構(gòu),把程序開(kāi)發(fā)擺到了流水線上。使用框架的優(yōu)勢(shì)在于能極大地促進(jìn)快速軟件開(kāi)發(fā),節(jié)約系統(tǒng)開(kāi)發(fā)的時(shí)間,創(chuàng)建更為穩(wěn)定的程序,并能減少開(kāi)發(fā)者的重復(fù)編寫(xiě)代碼的勞動(dòng)。
目前流行的PHP開(kāi)發(fā)框架有:Zend Framework、CakePHP、symfony、E框架、Codelgniter、ThinkPHP等。但使用框架也有一些不足,主要有:①增加系統(tǒng)的復(fù)雜性。②在提高大型項(xiàng)目開(kāi)發(fā)效率的同時(shí),降低了小型項(xiàng)目的開(kāi)發(fā)效率,③數(shù)據(jù)處理流程復(fù)雜化,從而在一定程序上影響系統(tǒng)的性能。④為了使框架具有良好的兼容性的,提供大量的功能組件和特性,普遍為重量型框架體系。
框架的重量型與輕量型是相對(duì)的,兩者解決問(wèn)題的側(cè)重點(diǎn)是不同的。輕量級(jí)框架側(cè)重于減小開(kāi)發(fā)的復(fù)雜度,相應(yīng)的它的處理能力便有所減弱(如事務(wù)功能弱、不具備分布式處理能力),比較適用于開(kāi)發(fā)中小型系統(tǒng)應(yīng)用。重量級(jí)框架則強(qiáng)調(diào)高可伸縮性,適合與開(kāi)發(fā)大型企業(yè)應(yīng)用。
輕量級(jí)框架和重量級(jí)框架的區(qū)別是以啟動(dòng)程序需要的資源來(lái)決定。比如,EJB啟動(dòng)的時(shí)候,需要消耗大量的資源如內(nèi)存,CPU等,所以是重量級(jí)。
鑒于此,本文提出一種基于MVC的輕量級(jí)PHP開(kāi)發(fā)框架,同時(shí)強(qiáng)調(diào)模塊化、插件化按需加載服務(wù)的框架體系,具備在降低開(kāi)發(fā)復(fù)雜度的同時(shí),增加系統(tǒng)的可伸縮性。
3輕量級(jí)WEB開(kāi)發(fā)框架設(shè)計(jì)與實(shí)現(xiàn)
3.1框架底層結(jié)構(gòu)
通過(guò)對(duì)Web常規(guī)應(yīng)用的抽象,整個(gè)框架可由系統(tǒng)初始化基本函數(shù)庫(kù)、系統(tǒng)核心類(lèi)庫(kù),模型類(lèi)庫(kù)等公共基礎(chǔ)類(lèi)組成。核心主要負(fù)責(zé)底層的操作,由核心加載系統(tǒng),加載模塊。在這里所謂系統(tǒng)是指多個(gè)模塊的集合體,系統(tǒng)內(nèi)各模塊由完成系統(tǒng)加載。各個(gè)系統(tǒng)的實(shí)現(xiàn)均以繼承系統(tǒng)父類(lèi)的方法來(lái)進(jìn)行擴(kuò)展,系統(tǒng)父類(lèi)中已經(jīng)實(shí)現(xiàn)了系統(tǒng)的功能,其余個(gè)性化的功能按系統(tǒng)的需求進(jìn)行擴(kuò)展實(shí)現(xiàn)。各個(gè)小功能模塊的實(shí)現(xiàn)也均以繼承模塊父類(lèi)的方法來(lái)擴(kuò)展,功能也是要按模塊需求擴(kuò)展。最終形成核心+系統(tǒng)+模塊+插件的體系架構(gòu)。
圖2:框架架構(gòu)圖
3.2框架的運(yùn)行過(guò)程
用戶(hù)請(qǐng)求URL時(shí)系統(tǒng)會(huì)根據(jù)URL路由進(jìn)行路徑的判定,如果適用于靜態(tài)化規(guī)則的,則直接返回指定的靜態(tài)化頁(yè)面;如果不是靜態(tài)URL的(偽靜態(tài)或動(dòng)態(tài)),則將請(qǐng)求轉(zhuǎn)發(fā)給相應(yīng)的控制器進(jìn)行解析,解析處理后再由相應(yīng)的控制器進(jìn)行響應(yīng),處理器通過(guò)與模型、視圖、緩存等進(jìn)行交互后最終形成完整的數(shù)據(jù)輸出給請(qǐng)求的用戶(hù)。
3.3開(kāi)發(fā)統(tǒng)一規(guī)范性要求
系統(tǒng)的二次開(kāi)發(fā),需要開(kāi)發(fā)者遵照框架設(shè)定的規(guī)范進(jìn)行,形成統(tǒng)一的標(biāo)準(zhǔn),以方便后續(xù)代碼的管理和維護(hù)。其中緩存文件根據(jù)不同的類(lèi)型分別存在在不同的子目錄和文件,主要的目錄和文件如表1所示。
3.4加載器
加載器是一個(gè)自動(dòng)包含所需的組件并將其進(jìn)行初始化的一類(lèi)函數(shù),它們根據(jù)用戶(hù)請(qǐng)求的URL判斷需要加載的模塊或插件,按需加載模塊或插件所特有的功能組件,可加載類(lèi)、模型、配置、語(yǔ)言包等。
3.5錯(cuò)誤處理
框架定義了Debug調(diào)試模式和常規(guī)模式兩種運(yùn)行機(jī)制。Debug調(diào)試模式主要用于系統(tǒng)開(kāi)發(fā)人員對(duì)系統(tǒng)進(jìn)行調(diào)試開(kāi)發(fā),輸出系統(tǒng)規(guī)定的報(bào)錯(cuò)信息,方便系統(tǒng)開(kāi)發(fā)人員調(diào)試系統(tǒng)。常規(guī)模式則屏蔽系統(tǒng)錯(cuò)誤,在用戶(hù)請(qǐng)求出錯(cuò)或系統(tǒng)出錯(cuò)時(shí),返回指定的頁(yè)面并記錄出錯(cuò)信息。系統(tǒng)開(kāi)發(fā)完成后,系統(tǒng)關(guān)閉Debug高度模式進(jìn)入常規(guī)運(yùn)行模式。
3.6模型、模塊
模型是對(duì)統(tǒng)核心代碼的應(yīng)用實(shí)例,通過(guò)對(duì)底層核心類(lèi)的繼承來(lái)擴(kuò)展功能,形成模型(在這里也稱(chēng)為模塊)特有的功能。支持常規(guī)的文章資訊、圖片、下載、視頻等模型應(yīng)用,支持對(duì)模塊進(jìn)行復(fù)制、安裝、暫停、刪除,真正實(shí)現(xiàn)按需加載,示例如圖3所示。
圖3:系統(tǒng)中模型的管理
3.7控制器
控制器是所有邏輯的中心,負(fù)責(zé)將用戶(hù)的URL以合理的方式響應(yīng)。系統(tǒng)采用多文件入口機(jī)制,用戶(hù)請(qǐng)求URL直接向具體的文件請(qǐng)求,提高了系統(tǒng)的運(yùn)行效率和具備良好的SEO支持。典型的URL請(qǐng)求如:http://localhost/admin.php?moduleid=7file=course??刂破骺梢韵蝾?lèi)庫(kù)、模型、緩存等眾多對(duì)象發(fā)送請(qǐng)求,并通過(guò)數(shù)據(jù)層和視圖層訪問(wèn),以實(shí)現(xiàn)清晰的分層分工機(jī)制。
3.8視圖/模板
視圖是使用控制器處理后的數(shù)據(jù)來(lái)渲染用戶(hù)指定的模板,以最終展現(xiàn)給用戶(hù)的界面。同一個(gè)視圖可以被不同的模型調(diào)用。視圖收到渲染請(qǐng)求后,為了提高渲染的效率,會(huì)優(yōu)先查找要渲染對(duì)象的緩存文件,如果緩存文件中存在,則將其加載到內(nèi)存,然后輸出數(shù)據(jù);如果緩存中不存在,同加載模板編譯器對(duì)模板進(jìn)行編譯,并存放在指定的位置,最后再加載并輸出數(shù)據(jù)。
3.9緩存機(jī)制
框架當(dāng)中大量使用緩存機(jī)制,系統(tǒng)運(yùn)行時(shí),直接讀取緩存文件,這極大地提高系統(tǒng)的執(zhí)行效率??晒┚彺娴男畔ㄏ到y(tǒng)配置信息、模塊配置信息、插件配置信息、視圖模板以及需要頻繁從數(shù)據(jù)庫(kù)讀取信息的數(shù)據(jù),時(shí)時(shí)系統(tǒng)也支持memcached緩存機(jī)制。當(dāng)系統(tǒng)要讀取的緩存文件不存在時(shí),將加載文件緩存生成器,生成相應(yīng)的緩存文件,并存放在指定的位置,如圖4所示。
圖4:部分重要的緩存目錄和文件
4總結(jié)
每個(gè)PHP框架都有自己的特色,如CodeIgniter是一個(gè)為建立PHP網(wǎng)站的人們所設(shè)計(jì)的工具包。其目標(biāo)在于快速的開(kāi)發(fā)項(xiàng)目,提供了豐富的庫(kù)組以完成常見(jiàn)的任務(wù)。本文提出的框架有利于團(tuán)隊(duì)合作開(kāi)發(fā),提供便利的模板機(jī)制,高效的緩存文件和多樣的URL規(guī)則,統(tǒng)一規(guī)范的文件目錄結(jié)構(gòu),以模塊化、插件化使系統(tǒng)功能和規(guī)模具備極高可伸縮性。
參考文獻(xiàn):
[1]郭欣.構(gòu)建高性能Web站點(diǎn)[M].北京:電子工業(yè)出版社,2009.
[2]劉立芳.基于MVC模式與插件式設(shè)計(jì)的開(kāi)發(fā)架構(gòu)的探討與實(shí)踐[J].電腦編程技巧與維護(hù).2011(14).
[3]劉宇祥 PHP流行框架的研究[J] 青春歲月.2012(8).
[4]趙增敏.PHP動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)[M].北京:電子工業(yè)出版社,2009.
作者簡(jiǎn)介:
劉倍雄(1983~)男,廣東汕頭人,碩士,從事計(jì)算機(jī)軟件開(kāi)發(fā)技術(shù)與嵌入式方面的教學(xué)與研究。
徐完平(1969~)男,湖北咸寧人,碩士,研究方向?yàn)檎Z(yǔ)義Web、Web服務(wù)。