韓 超
(衢州市氣象局, 浙江 衢州 324000)
淺談在線內(nèi)容管理系統(tǒng)的業(yè)務(wù)化改造
韓 超
(衢州市氣象局, 浙江 衢州 324000)
結(jié)合氣象部門的業(yè)務(wù)環(huán)境特點(diǎn),通過(guò)對(duì)在線內(nèi)容管理系統(tǒng)內(nèi)部URL機(jī)制的分析、數(shù)據(jù)模型的拓展以及功能模塊的改造構(gòu)建一個(gè)基于Web Service技術(shù)的數(shù)據(jù)交互平臺(tái)。讓運(yùn)行在移動(dòng)平臺(tái)、桌面系統(tǒng)平臺(tái)和網(wǎng)頁(yè)平臺(tái)的氣象業(yè)務(wù)系統(tǒng)能夠跨平臺(tái)、跨語(yǔ)言并且無(wú)需任何第三方附加得進(jìn)行數(shù)據(jù)交互,讓分布于不同節(jié)點(diǎn)以及不同類型的數(shù)據(jù)庫(kù)在這個(gè)交互系統(tǒng)中能夠協(xié)同調(diào)用。讓這個(gè)交互系統(tǒng)能夠基于網(wǎng)絡(luò)進(jìn)行針對(duì)性的優(yōu)化開發(fā)。
業(yè)務(wù)平臺(tái);數(shù)據(jù)交互;CMS;Web Service
在線數(shù)據(jù)的交互機(jī)制對(duì)于一些基于網(wǎng)絡(luò)服務(wù)的氣象業(yè)務(wù)來(lái)說(shuō),起著至關(guān)重要的作用。尤其是近年來(lái)移動(dòng)互聯(lián)技術(shù)的迅猛發(fā)展,伴隨著移動(dòng)智能終端數(shù)量的急劇增加,給網(wǎng)絡(luò)內(nèi)容推送的流暢性和穩(wěn)定性帶來(lái)了空前的壓力。一個(gè)沒(méi)有緩存機(jī)制和交互邏輯的網(wǎng)絡(luò)內(nèi)容管理系統(tǒng),不僅會(huì)大幅增加我們的硬件維護(hù)成本,更讓我們的網(wǎng)絡(luò)服務(wù)平臺(tái)在面對(duì)大量數(shù)據(jù)請(qǐng)求時(shí)陷入癱瘓。目前一些基于PHP語(yǔ)言開發(fā)的內(nèi)容管理系統(tǒng),雖然在工作邏輯和認(rèn)證方法上有著較為成熟的解決方案,但卻無(wú)法滿足氣象部門復(fù)雜數(shù)據(jù)環(huán)境的要求。因而了解這些內(nèi)容管理系統(tǒng)的工作機(jī)制,并結(jié)合氣象部門自身的網(wǎng)絡(luò)環(huán)境特點(diǎn)加以改造,將對(duì)氣象網(wǎng)絡(luò)平臺(tái)的服務(wù)體驗(yàn)有著極其重要的意義。
內(nèi)容管理系統(tǒng)也叫“Content Management System”,一般簡(jiǎn)稱為CMS系統(tǒng)。是一種介于Web服務(wù)器和辦公流程之間的軟件系統(tǒng)。它重點(diǎn)解決了各種非結(jié)構(gòu)化或半結(jié)構(gòu)化數(shù)字資源的采集、管理、利用、傳遞和增值,并能有機(jī)集成到結(jié)構(gòu)化數(shù)據(jù)的商業(yè)智能環(huán)境中。隨著網(wǎng)絡(luò)服務(wù)復(fù)雜度和功能性需求的不斷增長(zhǎng),如今以內(nèi)容管理為應(yīng)用核心的CMS產(chǎn)品大有百花爭(zhēng)艷的感覺(jué)。這些CMS大致上基于兩套框架編寫:PHP+MySQL和.NET+MSSQL。前者相比后者更具開放性和便攜性,能運(yùn)行于UNIX、LINUX、WINDOWS下,且PHP和MySQL兼具開源免費(fèi)的特點(diǎn),使得基于PHP+MySQL的CMS在市場(chǎng)采用率和系統(tǒng)成熟度上要優(yōu)于.Net+MSSQL的CMS。
近年來(lái)我國(guó)氣象事業(yè)的不斷發(fā)展使氣象業(yè)務(wù)發(fā)生了根本性的變化。如今的氣象部門以高分辨率、多方位連續(xù)監(jiān)測(cè)的觀測(cè)方式為主。這決定了氣象資料采集的高密度和龐大的數(shù)據(jù)量,并形成了資料存儲(chǔ)以結(jié)構(gòu)化數(shù)據(jù)庫(kù)為主非結(jié)構(gòu)化數(shù)據(jù)資料并重的現(xiàn)狀。Access、MsSQL、Oracle等多種數(shù)據(jù)庫(kù)在不同的氣象業(yè)務(wù)領(lǐng)域都發(fā)揮著不同的作用。氣象服務(wù)也從傳統(tǒng)的天氣預(yù)報(bào)領(lǐng)域向環(huán)境領(lǐng)域不斷拓展,伴隨而來(lái)的則是服務(wù)平臺(tái)、服務(wù)內(nèi)容和受眾群體的持續(xù)增長(zhǎng)。氣象部門在新形勢(shì)下的諸多特點(diǎn)要求一個(gè)合格的內(nèi)容管理系統(tǒng)因當(dāng)具備以下3點(diǎn)特質(zhì):首先,系統(tǒng)不能局限于單一的數(shù)據(jù)庫(kù)類型,要具備將不同的數(shù)據(jù)表內(nèi)容分散到不同數(shù)據(jù)庫(kù)中的功能。優(yōu)化系統(tǒng)實(shí)現(xiàn)負(fù)載均衡的同時(shí),還連接了分散在不同氣象領(lǐng)域的各個(gè)數(shù)據(jù)庫(kù)。其次,內(nèi)容管理系統(tǒng)對(duì)于氣象資料的推送不能局限于純靜態(tài)或動(dòng)態(tài)生成的方式,應(yīng)當(dāng)能夠響應(yīng)不同軟件平臺(tái)的要求分類推送不同性質(zhì)的內(nèi)容。擁有這種靈活的內(nèi)容緩存機(jī)制,才能通過(guò)網(wǎng)絡(luò)流暢穩(wěn)定得將氣象數(shù)據(jù)推送到性質(zhì)不同的終端上去。第三,系統(tǒng)還應(yīng)該擁有Web Service技術(shù)的一些特質(zhì),支持跨語(yǔ)言跨系統(tǒng)平臺(tái)之間的數(shù)據(jù)交互。綜合考慮這些特質(zhì),決定采用對(duì)二次開發(fā)比較友好的Phpcms系統(tǒng)作為業(yè)務(wù)化改造的基礎(chǔ)系統(tǒng),借由這個(gè)系統(tǒng)的數(shù)據(jù)交互邏輯并在數(shù)據(jù)模型的支持上加以改造。
Phpcms是一個(gè)基于MVC框架模式設(shè)計(jì)的CMS系統(tǒng)。它采用單一的入口文件,并且系統(tǒng)中的數(shù)據(jù)邏輯、數(shù)據(jù)顯示和用戶交互的處理部分都相互獨(dú)立。這種低耦合的構(gòu)建方式使得系統(tǒng)本身的視圖層和業(yè)務(wù)層分離,讓我們能以最小的代價(jià)對(duì)系統(tǒng)業(yè)務(wù)邏輯進(jìn)行拓展和改造。
系統(tǒng)啟動(dòng)從入口文件index.php開始,在這里加載并初始化了位于phpcms目錄下的框架入口文件base.php,在base.php里完成了一系列的系統(tǒng)變量及模型文件加載機(jī)制定義,最后進(jìn)入phpcm/lisbs/classes目錄下的應(yīng)用程序創(chuàng)建類application.class.php,實(shí)例化application之后系統(tǒng)實(shí)現(xiàn)了MVC框架里最重要的控制器功能并進(jìn)入了真正的程序邏輯部分:至此系統(tǒng)初始化工作基本完成,其邏輯流程如圖1所示。
圖1 系統(tǒng)初始化流程
2.1 URL路由機(jī)制
PHPCMS的控制器指向是由URL路由機(jī)制實(shí)現(xiàn)的,它是整個(gè)系統(tǒng)最關(guān)鍵的部分。這種路由機(jī)制是URL鏈接和系統(tǒng)模塊之間的橋梁,負(fù)責(zé)將進(jìn)入瀏覽器的請(qǐng)求映射到系統(tǒng)的各個(gè)控制器,以此讓系統(tǒng)作出不同的邏輯處理。它從系統(tǒng)入口文件index.php開始,附加3個(gè)名為“m”、“c”、“a”的固定url參數(shù),用來(lái)表示請(qǐng)求執(zhí)行模型“M”下名為“C”的控制器中名為“A”的方法。系統(tǒng)內(nèi)部的各個(gè)模型統(tǒng)一存放在modules文件夾下,所以一個(gè)形如index.php?m=content&c=index&a=show&catid=9&id=1鏈接的具體實(shí)現(xiàn)為, Url傳入后在application類的實(shí)例中對(duì)各個(gè)參數(shù)進(jìn)行拆解分類,篩選出“M”、“C”和“A”3個(gè)變量為系統(tǒng)固定參數(shù)其余變量為函數(shù)參數(shù),然后通過(guò)在base.php中定義的方法,在系統(tǒng)固定路徑下以變量“M”為文件名的模型文件夾中,找到以變量“C”為文件名的控制器文件,并最后在此文件中執(zhí)行以變量“A”為方法名的函數(shù)。所以這個(gè)鏈接的具體含義為執(zhí)行系統(tǒng)路徑下modules/content/index.php文件中的index->show方法,并且執(zhí)行的同時(shí)給show方法傳入catid=9和id=1兩個(gè)參數(shù)。
這種簡(jiǎn)便有效的控制器載入機(jī)制不僅局限于在網(wǎng)頁(yè)瀏覽器上展示網(wǎng)站內(nèi)容,它更支持通過(guò)HTTP協(xié)議的post和get方法與遠(yuǎn)程服務(wù)器進(jìn)行交互,以此可以在氣象業(yè)務(wù)網(wǎng)絡(luò)環(huán)境中建立一系列跨平臺(tái)跨語(yǔ)言的數(shù)據(jù)交互接口。例如一個(gè)氣象數(shù)據(jù)查詢平臺(tái),它的界面展示部分由delphi或C#語(yǔ)言開發(fā),它的數(shù)據(jù)查詢和數(shù)據(jù)邏輯部分基于CMS系統(tǒng)開發(fā)并通過(guò)Url的形式獲取。此時(shí)CMS系統(tǒng)不僅可以方便得對(duì)所有桌面程序的請(qǐng)求內(nèi)容和請(qǐng)求頻率進(jìn)行統(tǒng)計(jì),還可以基于統(tǒng)計(jì)的結(jié)果進(jìn)行優(yōu)化并以緩存的形式推送,即是將請(qǐng)求頻率較高的查詢內(nèi)容以xml、xsd、json文件的形式事先打包緩存在服務(wù)器。此外這個(gè)氣象數(shù)據(jù)查詢平臺(tái)的服務(wù)端URL請(qǐng)求鏈接可以用API文檔的形式組織起來(lái)并在氣象內(nèi)網(wǎng)上共享,其它業(yè)務(wù)開發(fā)或者平臺(tái)自身向ios、android系統(tǒng)拓展時(shí)都能作為一種寶貴資源被再次利用。
3.1 工廠模式
氣象部門基于數(shù)據(jù)庫(kù)所開發(fā)的業(yè)務(wù)平臺(tái)有很多,但能用多態(tài)性的編程理念,做到各類數(shù)據(jù)庫(kù)統(tǒng)一調(diào)用管理的平臺(tái)卻并不多見。PHPCMS系統(tǒng)雖然用工廠模式實(shí)現(xiàn)了這個(gè)機(jī)制,但系統(tǒng)本身的數(shù)據(jù)庫(kù)擴(kuò)展只停留在了MySql這一個(gè)類型上。所以理解CMS系統(tǒng)數(shù)據(jù)庫(kù)的多態(tài)性擴(kuò)展方式,并針對(duì)氣象部門擁有的數(shù)據(jù)庫(kù)類型進(jìn)行擴(kuò)展,成了業(yè)務(wù)改造工作中的重點(diǎn)。
PHPCMS數(shù)據(jù)庫(kù)操作的工廠模式通俗來(lái)說(shuō)就是用一個(gè)能夠創(chuàng)建多種數(shù)據(jù)庫(kù)實(shí)例的提供者類,根據(jù)配置設(shè)置或者程序邏輯來(lái)決定實(shí)例化哪一種數(shù)據(jù)庫(kù)。所以在PHPCMS系統(tǒng)內(nèi)部主要由以下4種類來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的多態(tài)性機(jī)制:1)能夠根據(jù)配置提供不同數(shù)據(jù)庫(kù)實(shí)例的工廠類。以db_factory.class.php命名,位于phpcms/libs/classes/目錄下;2)負(fù)責(zé)告訴工廠類應(yīng)該實(shí)例化哪種數(shù)據(jù)庫(kù)的配置類。以database.php命名,位于caches/configs/目錄下;3)用來(lái)被工廠類實(shí)例化并且負(fù)責(zé)實(shí)現(xiàn)數(shù)據(jù)庫(kù)具體操作的產(chǎn)品類。這種類文件的命名以數(shù)據(jù)庫(kù)名稱開頭,后面附加.class.php,形如mssql.class.php,位于phpcms/libs/classes/目錄下;4)根據(jù)工廠類可能提供的不同數(shù)據(jù)庫(kù)實(shí)例,實(shí)現(xiàn)不同數(shù)據(jù)庫(kù)實(shí)例同一化操作的模型類,為向后基于功能模塊的擴(kuò)展提供基類。以model.class.php命名,位于phpcms/libs/classes/目錄下。以上4種文件共同構(gòu)成了系統(tǒng)數(shù)據(jù)庫(kù)操作的基石,其功能布局和業(yè)務(wù)邏輯如圖2所示。
圖2 數(shù)據(jù)庫(kù)多態(tài)性擴(kuò)展的實(shí)現(xiàn)邏輯
3.2 數(shù)據(jù)庫(kù)操作模型的拓展
系統(tǒng)數(shù)據(jù)操作方面的改造工作首先應(yīng)當(dāng)從底層驅(qū)動(dòng)的擴(kuò)展開始。PHP作為開源免費(fèi)的項(xiàng)目多年來(lái)一直受到各大IT廠商的青睞,所以PHP對(duì)各類數(shù)據(jù)庫(kù)都有很不錯(cuò)的驅(qū)動(dòng)支持。在PHP官方主頁(yè)https://pecl.php.net的Database專欄下提供了55種功能各異特性不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng),包括在氣象業(yè)務(wù)工作中可能用到的Mssql、Oracle、Mysql、Sqlite甚至是DB2和Lotus Notes的驅(qū)動(dòng)。對(duì)同一種數(shù)據(jù)庫(kù)的驅(qū)動(dòng)選擇上,盡管以PDO為代表的驅(qū)動(dòng)能在不同數(shù)據(jù)庫(kù)之間提供統(tǒng)一的API接口,但非統(tǒng)一接口的驅(qū)動(dòng)在運(yùn)行效率、功能性和版本兼容性上都要優(yōu)于PDO驅(qū)動(dòng)。在獲得所需的驅(qū)動(dòng)文件后,手動(dòng)修改PHP的配置文件php.ini,加載相應(yīng)驅(qū)動(dòng)文件即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的拓展支持。在服務(wù)平臺(tái)有了對(duì)各類數(shù)據(jù)庫(kù)的基本支持后,相應(yīng)代碼的編寫工作可以從工廠模式下的四種類庫(kù)著手,重點(diǎn)是新建mysql.class.php為代表的產(chǎn)品類,小幅修改db_factory.class.php工廠類和model.class.php模型基類。
首先是產(chǎn)品類的拓展。一系列的產(chǎn)品類不僅關(guān)系到各種數(shù)據(jù)庫(kù)的直接操作,在系統(tǒng)內(nèi)部更負(fù)責(zé)向工廠類提供一致的實(shí)例化接口,向模型類model.class.php提供一致的數(shù)據(jù)庫(kù)操作方法,所以在代碼組織上要求各種產(chǎn)品類的方法函數(shù)要有一致的名稱,以及產(chǎn)品類之間的功能交集要大于等于模型類中調(diào)用到的方法函數(shù),只有這樣才能保證后面的模型類在拿到工廠類提供的數(shù)據(jù)庫(kù)實(shí)例后,能用統(tǒng)一的函數(shù)名實(shí)現(xiàn)功能一致的方法。所以在函數(shù)方法名稱上必須以mysql.class.php類為參照標(biāo)準(zhǔn),用“open”、“close”作為開啟和關(guān)閉數(shù)據(jù)庫(kù)連接資源的名稱標(biāo)識(shí)以備db_factory.class.php在實(shí)例化時(shí)調(diào)用,并以“select、get_one、query、insert、update、delete、count、affected_rows、get_primary、get_fields、table_exists、field_exists”為數(shù)據(jù)查詢的功能布局。在整個(gè)產(chǎn)品類的功能交集中,除了“select”方法所涉及到的分表查詢?cè)诓煌瑪?shù)據(jù)庫(kù)中略有區(qū)別外,其它功能方法都能在各自的驅(qū)動(dòng)接口API上找到。在mysql數(shù)據(jù)庫(kù)中分表查詢可以通過(guò)“l(fā)imit”語(yǔ)句輕松實(shí)現(xiàn),而在mssql和oracle中則需分別通過(guò)“ROW_NUMBER”和“RANK”來(lái)實(shí)現(xiàn)。在Oracle中需通過(guò)如圖3所示方式實(shí)現(xiàn)。
圖3 Oracle實(shí)現(xiàn)Limit分頁(yè)查詢的方法
在mssql中需通過(guò)圖4所示方式實(shí)現(xiàn)。
圖4 Mssql實(shí)現(xiàn)Limit分頁(yè)查詢的方法
產(chǎn)品類編寫完畢后,需要對(duì)PHPCMS系統(tǒng)原有的工廠類文件db_factory.class.php做小幅的改動(dòng),以適應(yīng)新增數(shù)據(jù)庫(kù)類型的實(shí)例化工作。db_factory.class.php類是基于單件模式設(shè)計(jì)的,類成員函數(shù)“get_database”通過(guò)接收一個(gè)代表數(shù)據(jù)庫(kù)類型的字符串參數(shù),來(lái)決定向外界傳遞何種類型的數(shù)據(jù)庫(kù)實(shí)例。
而這種類型初始化的選擇機(jī)制是通過(guò)一個(gè)switch-case語(yǔ)言來(lái)實(shí)現(xiàn)的。所以想要拓展工廠類所能支持的數(shù)據(jù)庫(kù)類型,只需在類函數(shù)“connect“內(nèi)的switch語(yǔ)句中,新增case選擇條件即可。例如“case′ mssql′:
pc_base::load_sys_class('mssql','',0);$object=new mssql();break;”這樣簡(jiǎn)單的幾行語(yǔ)句即可完成一類數(shù)據(jù)庫(kù)的擴(kuò)展工作。
在完成db_factory.class.php工廠類的改造工作后,再配合原系統(tǒng)的model.class.php模型基類,可以說(shuō)基本已經(jīng)完成了數(shù)據(jù)庫(kù)平臺(tái)支持的拓展工作。但鑒于部分?jǐn)?shù)據(jù)庫(kù)對(duì)于數(shù)據(jù)庫(kù)表名稱大小寫的特殊要求,還需要模型基類在讀取數(shù)據(jù)庫(kù)參數(shù)設(shè)置時(shí)做一些針對(duì)性的處理。例如在模型基類的構(gòu)造函數(shù)里添加“if($this->db_config[$this->db_setting]['type']=='oracle');$this->table_name=strtoupper($this->table_name);”,用來(lái)將database.php里的數(shù)據(jù)庫(kù)表名統(tǒng)一成大寫字母。
在系統(tǒng)數(shù)據(jù)操作類庫(kù)拓展完畢之后,可基于這種多態(tài)性的數(shù)據(jù)模型結(jié)構(gòu),并結(jié)合氣象業(yè)務(wù)的特點(diǎn)進(jìn)一步開展氣象業(yè)務(wù)模塊的開發(fā)工作。由于phpcms系統(tǒng)是基于MVC框架構(gòu)建的,受益于這種高內(nèi)聚、低耦合的代碼組織方式,我們的模塊開發(fā)工作可清晰的分為兩個(gè)部分:1)數(shù)據(jù)庫(kù)操作模型的拓展,在系統(tǒng)路徑“phpcms/mode/”下派生模型基類model.class.php,并且在database.php中完成相關(guān)參數(shù)配置;2)功能模塊的開發(fā),在系統(tǒng)路徑“phpcms/modules/”下新建以模塊名稱命名的文件夾,并在此文件中完成數(shù)據(jù)交互邏輯相關(guān)類庫(kù)的開發(fā)。
4.1 數(shù)據(jù)庫(kù)操作模型的拓展
拓展工作主要涉及database.php和model.class.php這兩個(gè)類文件。database.php并不是一個(gè)類文件,它僅作為一個(gè)代碼片段存在于phpcms系統(tǒng)的配置文件夾下,主要功能是向包含它的類庫(kù)文件返回一個(gè)數(shù)據(jù)庫(kù)配置信息列表以供變量成員挑選并賦值。database.php的代碼結(jié)構(gòu)由一個(gè)二維數(shù)組構(gòu)成,數(shù)據(jù)庫(kù)的連接參數(shù)以庫(kù)為單位存儲(chǔ)在這個(gè)數(shù)組里。數(shù)組的第一個(gè)維度是配置參數(shù)的自定義名稱,第二個(gè)維度則是這個(gè)名稱所對(duì)應(yīng)的具體參數(shù)。所以在database.php中新增數(shù)據(jù)庫(kù)參數(shù)配置,只需在文件返回的二維數(shù)組中新增一條形如“test=>array(…數(shù)據(jù)庫(kù)參數(shù)…)”的記錄即可。其次是在model.class.php類的基礎(chǔ)上派生新的數(shù)據(jù)模型。這個(gè)數(shù)據(jù)模型是基于表設(shè)計(jì)并且能被高度重用的。它僅表示數(shù)據(jù)庫(kù)操作層面的一種模型并不確切指向前臺(tái)的某種交互邏輯。數(shù)據(jù)模型與功能模塊之間的低耦合性,使得一個(gè)模塊功能的數(shù)據(jù)操作可以由多個(gè)指向不同類型數(shù)據(jù)庫(kù)的模型共同組成。model.class.php類的派生編寫工作也很簡(jiǎn)單,新的子類只需要在重載構(gòu)造函數(shù)時(shí)重新定義參數(shù)配置名和數(shù)據(jù)表名即可。
4.2 模塊的開發(fā)
系統(tǒng)模塊的根目錄位于“phpcms/modules/”路徑下,目錄中是以具體功能為分類命名的各個(gè)模塊文件夾,文件夾內(nèi)包含的類文件則是各類數(shù)據(jù)交互的執(zhí)行邏輯。在類文件的執(zhí)行方法中,以“$this->db = pc_base::load_model('xsweb_168_nowcasting');”的形式,在加載相應(yīng)數(shù)據(jù)模型的同時(shí)即可完成數(shù)據(jù)模型的初始化工作,然后根據(jù)model.class.php類中提供的方法函數(shù),便可完成數(shù)據(jù)庫(kù)的交互操作。只要熟知系統(tǒng)的URL機(jī)制和模塊加載機(jī)制,模塊類可按需推送圖片鏈接、二進(jìn)制文件鏈接或者直接推送明文或二進(jìn)制文件等各類數(shù)據(jù)格式。
模塊的開發(fā)工作可充分利用網(wǎng)絡(luò)語(yǔ)言的特點(diǎn)進(jìn)行深度優(yōu)化。僅以推送不同時(shí)間跨度的降水量統(tǒng)計(jì)數(shù)據(jù)為例:1)可在推送數(shù)據(jù)的同時(shí),模塊向系統(tǒng)自身提交一條url鏈接以統(tǒng)計(jì)請(qǐng)求的頻率和數(shù)量。如此可在不影響數(shù)據(jù)推送的同時(shí)完成統(tǒng)計(jì)工作;2)基于這種統(tǒng)計(jì),當(dāng)某時(shí)間跨度的雨量請(qǐng)求數(shù)量達(dá)一定量級(jí)時(shí),系統(tǒng)在更新請(qǐng)求數(shù)值的同時(shí),在特定目錄生成一個(gè)以時(shí)間戳和特定ID命名的內(nèi)容為空的標(biāo)識(shí)文件,并以此文件為信號(hào)決定是否在響應(yīng)請(qǐng)求時(shí)生成json或xml等格式的靜態(tài)文件緩存在服務(wù)器,在第二次響應(yīng)相同的請(qǐng)求時(shí)將靜態(tài)文件的內(nèi)容直接發(fā)送給客戶端;3)系統(tǒng)平臺(tái)可以是分布式存在于多個(gè)節(jié)點(diǎn)之中的。用一臺(tái)服務(wù)器作為響應(yīng)請(qǐng)求的入口,以請(qǐng)求客戶端的地理分布為條件向其它服務(wù)器分別發(fā)送請(qǐng)求信息并最終獲取請(qǐng)求結(jié)果反饋給客戶端;4)可將特定內(nèi)容提前生成緩存文件,在響應(yīng)請(qǐng)求時(shí)不經(jīng)過(guò)數(shù)據(jù)庫(kù)和其它執(zhí)行邏輯直接發(fā)送給客戶端。
“歷史上的今天”是衢州氣象內(nèi)網(wǎng)頁(yè)面中的一個(gè)數(shù)據(jù)展示模塊,欄目?jī)?nèi)容包含“歷史上的今天”、“歷史上的明天”、“歷史上的未來(lái)三天”和“歷史上的未來(lái)十天”4個(gè)方面,欄目數(shù)據(jù)涉及衢州各縣市建站以來(lái)各項(xiàng)溫度數(shù)據(jù),降水?dāng)?shù)據(jù)以及降水頻率的分類統(tǒng)計(jì)。由于網(wǎng)站本身通過(guò)對(duì)phpcms改造而構(gòu)建出一個(gè)Web Service平臺(tái),所以給欄目本身的多平臺(tái)拓展和優(yōu)化帶來(lái)了巨大的改變。
5.1 多平臺(tái)的拓展
從欄目?jī)?nèi)容上看,這類歷史均值、極值統(tǒng)計(jì)模塊的應(yīng)用范圍比較廣泛,在各類氣象網(wǎng)站、手機(jī)APP終端或桌面業(yè)務(wù)平臺(tái)中都非常常見。然而對(duì)于開發(fā)者來(lái)說(shuō),要在特性和編程語(yǔ)言都不盡相同的各個(gè)平臺(tái)中開發(fā)功能相近的項(xiàng)目,意味著大量重復(fù)且無(wú)法避免的數(shù)據(jù)庫(kù)編程工作。但基于web service平臺(tái)開發(fā)后,欄目在安卓平臺(tái)上推出時(shí)可由欄目現(xiàn)成的Url獲取數(shù)據(jù)并直接介入界面UI的開發(fā),其開發(fā)流程如圖5所示。
圖5 基于WebService技術(shù)的系統(tǒng)多平臺(tái)開發(fā)流程
5.2 優(yōu)化和效益評(píng)估
項(xiàng)目的跨平臺(tái)工作通常會(huì)帶來(lái)兩個(gè)不可避免的問(wèn)題。首先是支撐服務(wù)器維護(hù)的工作量會(huì)成倍增加。其次,隨著平臺(tái)數(shù)量的增加和客戶端系統(tǒng)的差異化加劇,系統(tǒng)的整體穩(wěn)定性會(huì)受到嚴(yán)峻的考驗(yàn),并導(dǎo)致系統(tǒng)優(yōu)化的難度不斷加大。然而通過(guò)改造Phpcms系統(tǒng)構(gòu)建一套基于web service技術(shù)的數(shù)據(jù)推送平臺(tái),能夠?qū)⑦@些難題化零為整,統(tǒng)一優(yōu)化一勞永逸。
在“歷史上的今天”這個(gè)欄目中,為了提高欄目本身的穩(wěn)定性和應(yīng)對(duì)大量客戶端并發(fā)請(qǐng)求的負(fù)載性能。
我設(shè)計(jì)了這樣一個(gè)簡(jiǎn)單而有效的php進(jìn)程協(xié)同模式:應(yīng)對(duì)短時(shí)間內(nèi)大量的并發(fā)請(qǐng)求時(shí),數(shù)百個(gè)各自獨(dú)立的php處理進(jìn)程并不會(huì)搶著向數(shù)據(jù)庫(kù)服務(wù)器要統(tǒng)計(jì)數(shù)據(jù),眾多進(jìn)程間會(huì)等待第一個(gè)向服務(wù)器發(fā)出請(qǐng)求的進(jìn)程,直至該進(jìn)程拿到統(tǒng)計(jì)數(shù)據(jù)并形成緩存文件,其他進(jìn)程再獲取這個(gè)緩存文件內(nèi)的統(tǒng)計(jì)結(jié)果。
為檢驗(yàn)欄目在如此改造后的工作效率,特別設(shè)計(jì)了這樣一個(gè)對(duì)比實(shí)驗(yàn):實(shí)驗(yàn)通過(guò)并發(fā)線程的方式模擬數(shù)百個(gè)客戶端在500 ms的時(shí)間內(nèi)隨機(jī)向服務(wù)器請(qǐng)求欄目所需的統(tǒng)計(jì)數(shù)據(jù),隨著并發(fā)客戶端數(shù)量的增加記錄每個(gè)客戶端完成統(tǒng)計(jì)需要的毫秒數(shù)并取平均值。實(shí)驗(yàn)的前提:1)實(shí)驗(yàn)的客戶端都是通過(guò)j2se編程的桌面程序;2)客戶端向服務(wù)器請(qǐng)求數(shù)據(jù)之前,服務(wù)器端不存在任何現(xiàn)成的緩存數(shù)據(jù)。
圖6 常規(guī)平臺(tái)與WebService優(yōu)化平臺(tái)對(duì)于短時(shí)并發(fā)請(qǐng)求的查詢效率對(duì)比
實(shí)驗(yàn)結(jié)果如圖6所示。其中,運(yùn)用常規(guī)方法統(tǒng)計(jì)數(shù)據(jù)的客戶端在并發(fā)數(shù)量達(dá)到400個(gè)時(shí),出現(xiàn)了大量數(shù)據(jù)庫(kù)連接超時(shí)的情形,并且隨著并發(fā)請(qǐng)求數(shù)量的不斷增加,單個(gè)線程完成統(tǒng)計(jì)所需的平均耗時(shí)從最初的3~5 s延遲到了1 min多鐘,甚至無(wú)法完成統(tǒng)計(jì)。但基于web service技術(shù)來(lái)請(qǐng)求數(shù)據(jù)的客戶端因?yàn)槭找嬗趙eb平臺(tái)本身的并發(fā)特性優(yōu)勢(shì)和一系列的優(yōu)化措施,其工作效率幾乎不受請(qǐng)求客戶端數(shù)量的影響。最后,基于web service的客戶端再次向服務(wù)器請(qǐng)求相同的統(tǒng)計(jì)數(shù)時(shí),由于服務(wù)器已有統(tǒng)計(jì)完成的緩存數(shù)據(jù),400個(gè)并發(fā)線程請(qǐng)求完成的平均時(shí)間只需要15 ms。
通過(guò)對(duì)Phpcms系統(tǒng)的分析和內(nèi)部數(shù)據(jù)模型的改造,建立了一個(gè)基于phpcms系統(tǒng)內(nèi)核并且能夠?qū)崿F(xiàn)Web Service技術(shù)的數(shù)據(jù)交互平臺(tái)。新平臺(tái)基于URL的路由機(jī)制使得數(shù)據(jù)交互能夠跨語(yǔ)言跨操作系統(tǒng),新平臺(tái)基于數(shù)據(jù)庫(kù)多態(tài)性的機(jī)制實(shí)現(xiàn)了不同數(shù)據(jù)庫(kù)的協(xié)同開發(fā)。新平臺(tái)基于網(wǎng)絡(luò)語(yǔ)言的優(yōu)化使得來(lái)自不同特性的客戶端請(qǐng)求有了一個(gè)高度整合和統(tǒng)一維護(hù)的平臺(tái)。
改造后的新平臺(tái)能使運(yùn)行在不同機(jī)器上的不同應(yīng)用無(wú)須借助附加的、專門的第三方軟件或硬件,就可相互交換數(shù)據(jù)或集成。系統(tǒng)本身也很容易部署, 因?yàn)樗鼈兓谝恍┏R?guī)的產(chǎn)業(yè)標(biāo)準(zhǔn)以及已有的一些技術(shù),諸如XML、HTTP、PHP。它不僅具有良好的維護(hù)性和擴(kuò)展性,它更為氣象部門的各個(gè)業(yè)務(wù)平臺(tái)在數(shù)據(jù)交互上提供了一個(gè)通用的機(jī)制,使得移動(dòng)氣象平臺(tái),桌面氣象平臺(tái)和網(wǎng)頁(yè)氣象平臺(tái)在交互上形成一個(gè)統(tǒng)一的整體,使我們的開發(fā)維護(hù)工作能夠基于3種平臺(tái)統(tǒng)籌兼顧。
[1] Ethan Cerami(美).Web Services Essentials[M].美國(guó):O′Reilly,2003
[2] 沈伯青,楊宗凱.WEB服務(wù)的基石:UDDI技術(shù)[J].計(jì)算機(jī)工程與應(yīng)用,2003:147-150.
[3] 鄧 瑩,馮向科.探討Web Service的關(guān)鍵技術(shù)及其實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2006(35):28.
2015-04-22