徐杰
(廣東郵電職業(yè)技術(shù)學(xué)院,廣東廣州 510630)
隨著計(jì)算機(jī)網(wǎng)絡(luò)特別是Internet的不斷發(fā)展,對(duì)Web編程的需求越來(lái)越大,基于B/S結(jié)構(gòu)的軟件的應(yīng)用也越來(lái)越廣泛。PHP和大家所熟知的ASP一樣,是一種服務(wù)器端、跨平臺(tái)、HTML嵌入式的腳本語(yǔ)言,常用于Web編程,運(yùn)行于服務(wù)器端。
PHP運(yùn)行于服務(wù)器端,用它編寫(xiě)的程序?qū)儆诜?wù)器程序,也就是我們常說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)程序,它的運(yùn)行速度與效率,直接影響著網(wǎng)站的運(yùn)作。那么如何編寫(xiě)高效的PHP代碼呢?
首先了解一下影響PHP軟件運(yùn)行速度的各種因素,這樣才能夠做到有針對(duì)性地避免PHP中使用耗時(shí)的代碼。
1)遞歸的使用。遞歸經(jīng)常會(huì)使程序?qū)崿F(xiàn)起來(lái)比較簡(jiǎn)單。但是,效率上會(huì)相對(duì)降低。因?yàn)檫f歸會(huì)對(duì)此的調(diào)用函數(shù)。在函數(shù)調(diào)用前,計(jì)算機(jī)會(huì)做一些初始化工作,這樣就會(huì)耗費(fèi)一些時(shí)間。如果遞歸的深度越大,效率隨之越低。
2)在程序中進(jìn)行重復(fù)的、相同的、數(shù)據(jù)量比較大的字符操作。比如,查找、替換、保存等。
3)過(guò)分地使用正則表達(dá)式。正則表達(dá)式在字符處理上可以說(shuō)用處非常強(qiáng)大,幾乎可以達(dá)到萬(wàn)能的程度。但是,不是在任何時(shí)候、任何情況下使用都是好的。應(yīng)該分清楚是否有需要為前提。就是因?yàn)檎齽t表達(dá)式功能的強(qiáng)大,使得它在效率上會(huì)相對(duì)于普通的字符處理函數(shù)效率低。就比如preg_replace和str_replace,在兩者都可以使用的前提下,當(dāng)然是使用str_replace效率高了。
4) void eval(string code_str)函數(shù)的使用。eval()把code_str中的字符串當(dāng)作PHP代碼解析執(zhí)行。這個(gè)比直接寫(xiě)成PHP代碼+HTML代碼的形式效率低。比如代碼:
比下面的效率更低。
直接輸出HTML數(shù)據(jù)test
5)使用多余的PHP語(yǔ)句或變量。比如在PHP中使用一些沒(méi)有意義和效果的語(yǔ)句,在輸出數(shù)據(jù)時(shí),總是先對(duì)數(shù)據(jù)進(jìn)行緩沖,然后再輸出。比如:
6) 還有PHP 和數(shù)據(jù)庫(kù)調(diào)用的問(wèn)題。
知道了影響PHP效率的因素之后,要在編寫(xiě)代碼的時(shí)候,加以注意,養(yǎng)成好的習(xí)慣,這樣高效的PHP代碼就寫(xiě)出來(lái)了。
根據(jù)上面的六點(diǎn),寫(xiě)PHP程序時(shí),需要注意:
1)減少遞歸函數(shù)的使用。在一些確實(shí)很耗費(fèi)時(shí)間的遞歸處理里面,可以把遞歸轉(zhuǎn)換成非遞歸方式。比如最常見(jiàn)的層級(jí)結(jié)構(gòu)的數(shù)據(jù)。
其中數(shù)組$data中的元素的標(biāo)號(hào)代表著它的上級(jí)的id號(hào)。displayBook函數(shù)就是把層級(jí)關(guān)系的數(shù)據(jù)從高到低逐級(jí)打印出來(lái)??梢园选鏳ata數(shù)組進(jìn)行結(jié)構(gòu)轉(zhuǎn)換,按照層級(jí)關(guān)系寫(xiě)成順序關(guān)系。比如:
然后再輸出,就可以避免了遞歸。
2)避免進(jìn)行重復(fù)的、相同的、數(shù)據(jù)量比較大的字符操作。如果是重復(fù)相同的操作,在第一次操作后,可以對(duì)數(shù)據(jù)操作的結(jié)果進(jìn)行數(shù)據(jù)緩沖。緩沖方式有文件緩沖方式和數(shù)據(jù)庫(kù)緩沖方式(后面詳細(xì)介紹)。
3)在可以使用正則或普通字符操作達(dá)到相同效果的情況下,則選擇使用普通字符操作。如上面提到的str_replace代替preg_replace。
4)避免使用無(wú)用的PHP語(yǔ)句,能夠直接輸出的數(shù)據(jù),則直接輸出,不要添加沒(méi)必要的PHP數(shù)據(jù)保存。
還有數(shù)據(jù)庫(kù)操作優(yōu)化,適當(dāng)?shù)奶砑铀饕⒈苊馊牟檎?,或?yōu)化全文查找,優(yōu)化SQL語(yǔ)句,提高執(zhí)行效率。
上面提到的是一些影響PHP運(yùn)行效率的一些因素及其解決辦法。下面介紹提高PHP執(zhí)行效率的一些技巧——數(shù)據(jù)緩沖。數(shù)據(jù)緩沖有文件緩沖和數(shù)據(jù)庫(kù)緩沖兩種。
1)文件緩沖
文件緩沖,是把最終數(shù)據(jù)保存在文件里面,讓程序直接讀取文件的內(nèi)容然后顯示出來(lái)或者拿來(lái)使用。比如現(xiàn)在的常見(jiàn)的靜態(tài)頁(yè),是把動(dòng)態(tài)PHP網(wǎng)頁(yè)訪(fǎng)問(wèn)后的結(jié)果數(shù)據(jù)保存在一個(gè)文件里面,在以后的訪(fǎng)問(wèn)里,就不需要再訪(fǎng)問(wèn)這個(gè)PHP頁(yè)面,而是直接訪(fǎng)問(wèn)生成的緩沖文件。這樣,在訪(fǎng)問(wèn)中,對(duì)服務(wù)器來(lái)說(shuō),只是消耗了帶寬,不需要消耗PHP的執(zhí)行時(shí)間,從而大大的提高了效率。不過(guò)這個(gè)方法有個(gè)缺點(diǎn),就是需要耗費(fèi)比較大的磁盤(pán)空間。一般的實(shí)現(xiàn)方法是,把PHP執(zhí)行后的數(shù)據(jù),先不輸出,而是保存在一個(gè)變量里面,然后用讀寫(xiě)文件的方式,寫(xiě)到一個(gè)文件里面。PHP編譯型模板也是對(duì)這種技巧的一個(gè)很好的應(yīng)用。
2)數(shù)據(jù)庫(kù)緩沖
數(shù)據(jù)庫(kù)緩沖,是把數(shù)據(jù)保存在數(shù)據(jù)庫(kù)里面。這些數(shù)據(jù)可能是從數(shù)據(jù)庫(kù)獲取,而且獲取數(shù)據(jù)需要耗費(fèi)比較多的時(shí)間,數(shù)據(jù)內(nèi)容是長(zhǎng)時(shí)間不會(huì)改變,或者這些數(shù)據(jù)會(huì)以各種方式在不同的地方調(diào)用,這樣就需要把這些數(shù)據(jù)作數(shù)據(jù)庫(kù)緩沖。數(shù)據(jù)的形式可以是字符串、數(shù)組。如果是數(shù)組,需要用serialize()函數(shù)轉(zhuǎn)換成字符串,然后保存,提取數(shù)據(jù)的時(shí)候,要用unserialize()函數(shù)對(duì)其進(jìn)行還原。
如 www.phparticle.net開(kāi)發(fā)的phpArticle v2.1.1是提高PHP代碼效率的一個(gè)很成功的例子。而且phparticlev2.1.1是開(kāi)源的,可以閱讀源代碼來(lái)更好地理解和掌握上面提到的方法。
上面是做PHP開(kāi)發(fā)時(shí)總結(jié)的一些經(jīng)驗(yàn)和方法,希望能夠?qū)Υ蠹矣袔椭?/p>
[1]陸昌輝,熊帥,劉瑞濤.PHP WEB開(kāi)發(fā)快速入門(mén)及實(shí)例精選[M].北京:電子工業(yè)出版社,2008.
[2]陳營(yíng)輝.PHP網(wǎng)絡(luò)編程從入門(mén)到精通[M].北京:清華大學(xué)出版社,2007.
[3]馮祖洪.用PHP訪(fǎng)問(wèn)Mysql數(shù)據(jù)庫(kù)的方法[J].現(xiàn)代電子技術(shù),2002,(6).
[4]付俊英.基于PHP的Web數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)[J].計(jì)算機(jī)與信息技術(shù),2001,(9).
[5]黃國(guó)輝.PHP聊天室技術(shù)[J].計(jì)算機(jī)與信息技術(shù),2002,(8).
[6]賈素來(lái).使用PHP和MySQL開(kāi)發(fā)動(dòng)態(tài)網(wǎng)站[J].大眾科技,2011,(3).
湖南郵電職業(yè)技術(shù)學(xué)院學(xué)報(bào)2012年2期