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