PHP系統(tǒng)設(shè)計(jì)與云架構(gòu)
這幾年我比較少寫(xiě) PHP 了.
有陣子很迷它, 但是因?yàn)楣ぷ麝P(guān)系, 把較多的時(shí)間花在網(wǎng)絡(luò)封包和數(shù)據(jù)庫(kù)的分析工作上.
而且因?yàn)槟暧涊^大了所以也很難找到寫(xiě)程序的工作多半都在做工程師的 “工頭”
對(duì)于這幾年 PHP 的變化我來(lái)不及參與.
在這裡收集這幾年對(duì) PHP 的變化, 寫(xiě)篇心得過(guò)過(guò)本人自己的乾隱:
回顧您以往的職業(yè)生涯, 您有好好的管理您寫(xiě)的 CODE 嗎?
還是每次都寫(xiě)到需求超級(jí)肥大了, 才延伸出一大堆的程序碼管理問(wèn)題.
在這裡本人設(shè)計(jì)一個(gè)開(kāi)發(fā)框架的架構(gòu), 讓你的程序更簡(jiǎn)潔而且讓你的程序更有條有理的被應(yīng)用.
當(dāng)然這些架構(gòu)教程我己經(jīng)簡(jiǎn)化很多, 如果放入太多的設(shè)計(jì)反而會(huì)得到反效果.
如果您是比較重口味的 PHP 設(shè)計(jì)者, 先說(shuō)聲報(bào)歉了.
如果您常為了需求肥大難以管理你的程序,
這篇文章對(duì)您來(lái)說(shuō)會(huì)是個(gè)值得參考的文章, 至少它有著我十幾年的需求開(kāi)發(fā)經(jīng)驗(yàn).
一.常見(jiàn)的 PHP 應(yīng)用的架構(gòu):
在往下教程下去前, 本人先定義一些名詞, 以方便大家接下去閱讀教程.
- DB :
這一塊不用多介紹, 我相信大家對(duì) DB 的經(jīng)驗(yàn)獨(dú)道, 我們直接跳過(guò)去.
-
Access Layer :
這一塊全部都是放一些 Access Logic 在裡頭, 主要的工作是負(fù)責(zé)跟 DB 還有 MEMCACHE 溝通, 你可以使用現(xiàn)成的開(kāi)發(fā)框架達(dá)成這一層的目地, 也可以自己開(kāi)發(fā).但是這些邏輯建議您都保留在這一層. - MEMCACHE :
這一塊主要是做為分散式架構(gòu)的存取層, 大家有沒(méi)有注意到一件事?它是走 TCP 11211 PORT .
它可以用在什麼地方?
a.讓你可以把從 DB 的資料撈到快取一份到 MEMCACHE ,來(lái)減輕資料庫(kù)的工作負(fù)擔(dān), 這在大型而且流量很高的系統(tǒng)上, 它辨演很重要的角色就是可以減輕 DB 的工作量.
*我們這裡不多介紹 Memcahe 的使用及方式, 您可以多參考官方網(wǎng)站或其它網(wǎng)絡(luò)上的教程.
b.有一些不用儲(chǔ)存用完就不要的資料, 也可以利用 memcache 直接存取不用再交給 DB 去處理.
c.注意一件事:
在過(guò)去裡我的下屬們?cè)谑褂盟鼤r(shí)常會(huì)犯一個(gè)錯(cuò)就是爛用 Memcache ,
memcache 本身是一個(gè) TCP 的服務(wù)在單臺(tái) linux 伺服器下最多只能使用1024個(gè)請(qǐng)求, 當(dāng)然你可以用 ulimit 提高它, 但是請(qǐng)先了解它的本質(zhì)用對(duì)地方.
它本身并不能做為程序本身加快程序效能的工具, 但是它是一個(gè)可以做到分散式的存取架構(gòu), 并且可以減輕 DB 負(fù)擔(dān)的工具, 的好用工具.
所以在使用它時(shí)要選對(duì)時(shí)機(jī), 千萬(wàn)不要爛用.
- Access Layer :這一層的工作主要是存取資料層的邏輯, 我將會(huì)2.會(huì)有更詳細(xì)的說(shuō)明.
- Content Logic Layer :這一層的工作主要是負(fù)責(zé)處理存取層從 資料層要來(lái)的資料的邏輯, 我將會(huì)3.會(huì)有更詳細(xì)的說(shuō)明.
- Presentation Layer :這一層的工作意義重大, 它主要是標(biāo)準(zhǔn)化 Presentation Logic 與 Content Logic Layer 溝通的標(biāo)準(zhǔn),讓你的畫(huà)面邏輯不會(huì)愈來(lái)愈肥大及復(fù)雜, 我將會(huì)4.會(huì)有更詳細(xì)的說(shuō)明.
- Presentation Logic Layer :這一層的工作是做為讓 你的畫(huà)面邏輯可以采用標(biāo)準(zhǔn)化的介面來(lái)與伺服器溝通, 如果 Presentation Layer 標(biāo)準(zhǔn)化了, 你的畫(huà)面邏輯的可重覆利用性就會(huì)更高及有彈性, 我將會(huì)5.會(huì)有更詳細(xì)的說(shuō)明.
- Client Layer :這一層就是我們平時(shí)便用的瀏覽器,云端服務(wù)等等的應(yīng)用, 相信大家非常了解這一層可以做到的事, 所以我們就不多介紹 Client Layer 了.
#p#
二.功能方塊介紹:
到這裡我們必需要將圖裡的方塊切的更細(xì)讓大家理解請(qǐng)耐心的看完下一張圖:
1. 數(shù)據(jù)庫(kù)邏輯層 :
Access Logic Layer 主要的工作是做為與 DB 和 Content Logic 溝通的區(qū)塊, 在這裡本人建議大家在設(shè)計(jì)物件庫(kù)或函式庫(kù)前, 先參考這個(gè)架構(gòu).
把所有跟資料庫(kù)存取的邏輯全部包裝在這個(gè)區(qū)塊下, 例如大家在設(shè)計(jì)DB時(shí)***用 Factory 來(lái)做 DB 的切換, 同時(shí)把這些邏輯全部整到這一層讓您的程序更有層次更好管理.
看到這裡大家一定對(duì)一些使用 Factory 設(shè)計(jì)的 OOP DB 存取函式庫(kù)不漠生.
這時(shí)我要介紹大家一個(gè)名詞, Object-relational_mapping :
http://en.wikipedia.org/wiki/Object-relational_mapping
什麼地方有 ORM ?就是大家常用的.
CAKE PHP
ZEND FRAMEWORK.
Doctrine
Propel
CoughPHP
Symphony
當(dāng)然…您也可以自己寫(xiě), 重點(diǎn)是, 要懂得怎麼有效率的去管理你的存取層的邏輯.
而一但定義了這一層.
強(qiáng)烈建議在接下來(lái)的 Content Logic Layer , Presentation Logic Layer 嚴(yán)格禁止其它邏輯層的邏輯跳過(guò)它來(lái)存取資料庫(kù).
這麼做有什麼好處? :
1.確保其它工作者不會(huì)寫(xiě)出不良的DB存取邏輯造成你的系統(tǒng)不好維護(hù)
2.你可以不用再擔(dān)心會(huì)有嚴(yán)重的存取層 BUG
3.它在使用上變的更安全, 不會(huì)讓你的資料庫(kù)暴露在 Content & Presentation Logic Layer ,讓你的 DB 有一定程度的保障.
4.如果你的 ORM TOOL 有提供管理器, 你還可以把所有的 SQL 語(yǔ)法倒出來(lái)檢示有沒(méi)有什麼存取過(guò)重的語(yǔ)法.
5.最重要的!!你可以把常用的存取層資料跟 MEMCACHE 做有效的資源管理, 讓你的 DB 的資源更有效的被利用!!
補(bǔ)充說(shuō)明:
- Access MYSQL :資料庫(kù)的新增改查邏輯全部放在這.
- Access Memcache :與 MEMCACHE 存取的新增改查邏輯全部放在這.
- Access NOSQL :現(xiàn)在***的 NOSQL ,你可以分別的去包裝你要的邏輯在這裡面.
- Other :如果你有別的使用資料存取的邏輯, 可以參造上述的方式一一的去整理….
2. 邏輯層 :
這一層有什麼東西?
1.你們服務(wù)用的到的商業(yè)邏輯, 你可以把每個(gè)商業(yè)邏輯用 OOP 設(shè)計(jì), 并且放在這一塊, 以利日后的管理.
2. String Parser :
為什麼在這篇教程裡我會(huì)建議您設(shè)計(jì)這塊? 因?yàn)樗匦铦M足 Presentation Layer 要求的幾個(gè)素求:
1.一致性高,2.可重覆利用性高, 3.跨平臺(tái)性高,4.云端應(yīng)用, 所以大家不要關(guān)掉文章快點(diǎn)看到3.怎麼讓你的系統(tǒng)可以符合這四個(gè)素求.
3.表示層:
我為何在這篇教程裡, 放入了這一層的應(yīng)用?
這要回顧到10年前, 我入手了一本 Wrox 的 Professional PHP4.
這本書(shū)我印象深刻, 因?yàn)樗还灿惺粋€(gè)作者在寫(xiě): 當(dāng)時(shí)看到它有一篇單元 “多層式架構(gòu)開(kāi)發(fā)” ,讓我對(duì)整個(gè) WEB 架構(gòu)開(kāi)發(fā)的視野完全打開(kāi).
不過(guò)我得承認(rèn)我以前很嘴賤, 常說(shuō) SMARTY TEMPLATE 是玩具.
PS : SMARTY TEMPLATE 采用 tpl php var 的方式來(lái)做少了這一層,常會(huì)極端的用些言語(yǔ)說(shuō)它不好.
你可以參考這二本書(shū), 會(huì)發(fā)現(xiàn)這一層放入這個(gè)設(shè)計(jì)會(huì)讓你未來(lái)工作變的輕松很多.
http://www.amazon.com/Profession … homas/dp/1861006918
http://www.amazon.com/Profession … p;keywords=PHP4+XML
#回到正題-
這一層專門(mén)用來(lái)處理 Content Logic Layer 處理好的資料, 利用 XML , JSON 等標(biāo)準(zhǔn)化的介面語(yǔ)言, 來(lái)規(guī)范你的 Content Logic Layer 按照你的 Convention (規(guī)范)來(lái)吐出資料給 Presentation Logic Layer
a.這樣做有什麼好處:
1.一致性高:
也因?yàn)檫@樣, 你的 Presentation Layer 有著標(biāo)準(zhǔn)化的格式, 所以你在使用 AJAX , AS , PHP SDK 等…做畫(huà)面邏輯串接時(shí),
你的畫(huà)面邏輯的程序?qū)?huì)變的一致性很高, 因?yàn)槎际菂⒖纪瑯拥母袷? 讓你的畫(huà)面邏輯的程序不會(huì)亂長(zhǎng).
工程師因?yàn)槭煜は嗤慕槊娓袷? 工作起來(lái)將會(huì)非常的輕松.
2.可重覆利用性高:
在你享受 Presentation Layer 有著標(biāo)準(zhǔn)化的格式的好處時(shí), 你會(huì)發(fā)現(xiàn),你可以把畫(huà)面邏輯也整理起來(lái)重覆利用,
這時(shí)你會(huì)發(fā)現(xiàn)你少寫(xiě)好多好多的程序碼.
例如: 換頁(yè)邏輯, 表單的呈現(xiàn)………..等等等, 只要另外塞 CSS 進(jìn)來(lái)就好了. 根本不用寫(xiě)什麼程序.
3.跨平臺(tái)性高:
啥咪?還有.是的!!!大家記得 RSS 嗎? RSS就是利用了 Presentation Layer 這個(gè)特性讓各種平臺(tái)都可以串接 BLOG 的文章內(nèi)容, 讓你的系統(tǒng)有著強(qiáng)大的夸平臺(tái)性整合能力.
4.云端應(yīng)用:
是的即然跨平臺(tái)性高了, 也就是你完成這個(gè)需求的同時(shí), 你所有的系統(tǒng)內(nèi)容的呈現(xiàn)可以丟給任何云端平臺(tái)的整合!
b.使用心得:
這個(gè)設(shè)計(jì), 會(huì)讓你的系統(tǒng)架構(gòu)非常靈活, 靈活到什麼程度?
以往一組新增/修改/刪除/換頁(yè)/搜尋, 只要寫(xiě)完一次而且完整的從下到上每一層整合上來(lái).
我?guī)缀醪挥枚伍_(kāi)發(fā), 直接套用之前寫(xiě)好的 content Logic , Presentation Logic 就可以完成一個(gè)需求.
一天可以完工三十幾組新增/修改/刪除/換頁(yè)/搜尋的串接, 所以我當(dāng)時(shí)消耗需求的速度比起一般沒(méi)有用這個(gè)設(shè)計(jì)技巧快上非常的多.
而大家心裡會(huì)有疑問(wèn), 這不就是以前 RUBY & CAKE PHP 的特性嗎?是的!!就這個(gè)理念!
不過(guò)有差異, 就是 CAKE PHP 在做畫(huà)面邏輯時(shí), 它并不會(huì)真的把這層切開(kāi), 而是將 MVC 裡的 V 和 C 有效化的重覆利用, 但是一但要使用云端應(yīng)用和夸平臺(tái)時(shí),
之前寫(xiě)過(guò)的程序無(wú)法直接透過(guò) Presentation Layer 拉出去給第三方平臺(tái)做串接.
雖然省了 ORM 那一層的重覆開(kāi)發(fā), 但是 Content Layer 和 Presentation Layer 還是要在手工調(diào)整的.
而一但一調(diào)整, 就會(huì)產(chǎn)生, DEBUG ,開(kāi)發(fā), 穩(wěn)定性, 和你又多了一堆CODE 要維護(hù)的工作….
4. 表現(xiàn)邏輯層 :
這一層講起來(lái)輕松多了, 因?yàn)榇蠹壹航?jīng)有了非常多的 AJAX , XSL , FACEBOOK SDK , IOS , ANDROID , FLASH AS 的串接經(jīng)驗(yàn).
沒(méi)錯(cuò), 這裡就是把之前辛苦定義并且做好的 Presentation Layer 吐出來(lái)的格式做應(yīng)用.
你可以透過(guò)~HTTP , SOCKET SERVER 等等..將你的 Presentation Layer 的 JSON , XML 吐出來(lái), 并且交給你的畫(huà)面邏輯程序去串接.
這麼一來(lái)你也輕松完成了一個(gè)云端的整合介面, 讓你寫(xiě)的 PHP 可以廣泛的使用在任何不同的平臺(tái)上.
5. 單元測(cè)試/壓力測(cè)試/集成測(cè)試:
在我開(kāi)發(fā)每一層的元件時(shí), 我都會(huì)要求工程師, 做單元測(cè)試(UNIT TEST), 壓力測(cè)試( Stress Test ), 整合測(cè)試( Integration Test )
a.單元測(cè)試(UNIT TEST): 你可以使用 PHPUNIT 或是自己寫(xiě), 針對(duì)你的一個(gè)函數(shù)的進(jìn)和出的測(cè)試, 并且預(yù)先寫(xiě)好 TEST CASE ,確保每一層的函式庫(kù)都是非常穩(wěn)定而且沒(méi)有問(wèn)題的, 來(lái)讓你管理程序的品質(zhì).
b.壓力測(cè)試(Stess TEST): 針對(duì)每一個(gè)函式庫(kù)的邏輯, 在做 UNIT TEST 的同時(shí), 將 STRESS TEST 的 TEST CASE 喂進(jìn)去, 并且記錄每一個(gè)函式處理 TEST 所消耗的時(shí)間.
c.整合測(cè)試(Integration Test): 你可以寫(xiě)一支程序, 做 DAILY BUILD 每天去檢查所有程序設(shè)計(jì)師 COMMIT 到 SVN 的程序碼是否有問(wèn)題, 確保每個(gè)函式之間整合是正常的, 降低 DEBUG 的工作量.