【IT168 技術(shù)】在Web開(kāi)發(fā)世界里,PHP是最流行的語(yǔ)言之一,從PHP里,你能夠很容易的找到你所需的腳本,遺憾的是,很少人會(huì )去用“最佳做法”去寫(xiě)一個(gè)PHP程序。這里,我們向大家介紹PHP的10種最佳實(shí)踐,當然,每一種都是經(jīng)過(guò)大師們證明而得出的。
1. 在合適的時(shí)候使用PHP – Rasmus Lerdorf
沒(méi)有誰(shuí)比PHP的創(chuàng )建者Rasmus Lerdorf明白PHP用在什么地方是更合理的,他于1995年發(fā)布了PHP這門(mén)語(yǔ)言,從那時(shí)起,PHP就像燎原之火,燒遍了整個(gè)開(kāi)發(fā)陣營(yíng),改變了互聯(lián)網(wǎng)的世界??墒?,Rasmus并不是因此而創(chuàng )建PHP的。PHP是為了解決web開(kāi)發(fā)者的實(shí)際問(wèn)題而誕生的。
和許多開(kāi)源項目一樣,PHP變得流行,流行的動(dòng)機并不能用正常的哲學(xué)來(lái)進(jìn)行解釋?zhuān)踔亮餍械糜行┕路甲再p。它完全可以作為一個(gè)案例,一個(gè)解決各種Web問(wèn)題的工具需求所引起的案例,因此當PHP剛出現的時(shí)候,這種工具需求全部聚焦到PHP的身上。
但是,你不能奢望PHP可以解決所有問(wèn)題。Lerdorf是第一個(gè)承認PHP只是一種工具的人,并且PHP也有很多力所不能及的情況。
根據工作的不同來(lái)選擇合適的工具。我跑了很多家公司,為了說(shuō)服他們部署和使用PHP,但是這并不意味著(zhù)PHP對所有問(wèn)題都適用。它只是可以一個(gè)解決大部分問(wèn)題的front-end腳步語(yǔ)言。
作為一個(gè)web開(kāi)發(fā)者,嘗試用PHP解決所有問(wèn)題是不科學(xué)的,同時(shí)也會(huì )浪費你的時(shí)間。當PHP玩不轉的時(shí)候,不要猶豫,試用一下其他的語(yǔ)言吧。
2. 使用多表存儲提高規模伸縮性 – Matt Mullenweg
沒(méi)有人愿意質(zhì)疑Matt Mullenweg在PHP方面的權威性,他開(kāi)發(fā)了這個(gè)星球上最流行的blog系統,(依靠一個(gè)強大的社區力量支持): WordPress. 創(chuàng )建Wordpress以后,Matt和他的團隊啟動(dòng)了WordPress.com平臺,一個(gè)基于WordPress MU的免費blog站點(diǎn)?,F在,Wordpress.com已經(jīng)擁有大約400萬(wàn)用戶(hù), 這些用戶(hù)每天提供超過(guò) 140,000篇的日志。 (要查看更多Wordpress.com的統計情況,請點(diǎn)擊這里.)
如果有人知道如何讓網(wǎng)站的規模伸縮自如,這個(gè)人一定是Matt Mullenweg。2006年的時(shí)候 Matt對Wordpress的數據結構進(jìn)行了前瞻性的改進(jìn),并且解釋了為什么Wordpress MU對每個(gè)blog使用獨立的MYSQL表格, 而不是把所有的blog數據都塞進(jìn)一個(gè)巨大的表格。
我們測試過(guò)這個(gè)方法,但是發(fā)現如果要擴展它的伸縮性,代價(jià)太高。如果用一個(gè)整體的數據結構,在大流量面前,你將會(huì )面臨服務(wù)器硬件的問(wèn)題。在MU里面。用戶(hù)們都被分布到獨立的表格當中,并且可以輕易地組織起來(lái)。舉個(gè)例子,WordPress.com把用戶(hù)的數據分散存儲到4096個(gè)數據庫中,這些數據庫可以分散大規模的數據訪(fǎng)問(wèn),實(shí)現流量和壓力分流。
數據表的可遷移性讓代碼(blog)可以運行得更快,并且讓系統具備更強的伸縮性。依靠強大的緩存策略和靈活的數據庫運用策略, Matt向人們展示了時(shí)下最流行的Facebook和Wordpress.com都可以在PHP下穩定運行,并且處理驚人的訪(fǎng)問(wèn)量。
3. 千萬(wàn)不要相信用戶(hù) – Dave Child
Dave Child是Added Bytes (previously ilovejackdaniels.com) 網(wǎng)站的核心人物,這個(gè)網(wǎng)站以他出色的《cheat sheets for many programming languages》而聞名。 Dave為很多英國的公司服務(wù),并且已經(jīng)在編程世界里樹(shù)立起相當的權威。
Dave為PHP開(kāi)發(fā)者提供了很多深謀遠慮的建議,并總結成了《writing secure code in PHP》:千萬(wàn)不要相信你的用戶(hù),他們甚至可能會(huì )傷害你。
有一條web開(kāi)發(fā)的基本原則,我重復多少遍都覺(jué)得不夠,那就是:千萬(wàn)不要相信你的用戶(hù),同時(shí)要假設你網(wǎng)站中的每個(gè)數據單元都是從用戶(hù)那里收集來(lái)的惡意代碼。很多時(shí)候,你必須用javascript在客戶(hù)端檢驗表單提交過(guò)來(lái)的內容, 如果你習慣了如此,那么,這是一個(gè)好習慣。如果安全性對你來(lái)說(shuō)很重要,這就是最重要最需要學(xué)習的原則。
Dave目前正致力于為它的《Writing Secure PHP》系列書(shū)籍整理實(shí)例,書(shū)的最后他說(shuō):
Ben Balbo開(kāi)發(fā)了Site Point,一個(gè)為developers和designers提供指導的網(wǎng)站。他是墨爾本PHP開(kāi)發(fā)和開(kāi)源俱樂(lè )部的成員, 因此他對PHP有一定的了解,同時(shí)對PHP caching有一定的想法和經(jīng)驗。
如果你擁有一個(gè)訪(fǎng)問(wèn)量很大,但更新并不頻繁的站點(diǎn)(比如blog,基于某種CMS),或許它需要進(jìn)行一些改造,這些改造不會(huì )花費太多的時(shí)間,但是對性能有突出的貢獻。 如果要為一個(gè)復雜/更新頻率很快的站點(diǎn)建立緩存機制,過(guò)程可能會(huì )很曲折,但是好處也是顯而易見(jiàn)的。
PHP緩存技術(shù)有很多種,Ben為我們推薦了如下一些:
◆緩存函數的運行結果
◆設置過(guò)期時(shí)間
◆緩存IE下載的文件
◆模板緩存技術(shù)
◆Cache_Lite
由于PHP作為動(dòng)態(tài)語(yǔ)言的特性,緩存機制對于更新頻率并不快的站點(diǎn)來(lái)說(shuō)非常重要。
5. 使用IDE, Templates和Snippets加速PHP開(kāi)發(fā) – Chad Kieffer
當Chad Kieffer從UI設計和數據庫優(yōu)化的工作中抽身出來(lái)的時(shí)候,他會(huì )在他的博客2 tablespoons上分享很多技術(shù)經(jīng)驗。由于Chad多方面的全面發(fā)展,他經(jīng)??梢园l(fā)現其他程序員不能發(fā)現的問(wèn)題,并形成相關(guān)經(jīng)驗,尤其是他開(kāi)發(fā)網(wǎng)站的方法。他參與了網(wǎng)站開(kāi)發(fā)的各個(gè)環(huán)節,因此他的建議對于提高網(wǎng)站開(kāi)發(fā)的大局觀(guān)非常有用。
Chad認為使用Eclipse PDT(Eclipse’s PHP development package) 這樣的IDE,同時(shí)使用一些模板技術(shù)和開(kāi)源項目可以有效地提高PHP的開(kāi)發(fā)速度。
緊湊的計劃,長(cháng)長(cháng)的to do lists以及deadlines讓開(kāi)發(fā)人員非??鄲?。不過(guò)有些功能,比如Eclipse Templates,可以有效減少編碼的時(shí)間和出錯的幾率。
通常來(lái)說(shuō),任何項目都可以自動(dòng)化,自動(dòng)化程度越高, 你完成項目的時(shí)間就越短?;〞r(shí)間來(lái)開(kāi)發(fā)使用頻率很高的框架和模板,將會(huì )節省你以后更多時(shí)間。同時(shí),使用像Eclipse and the PDT package這樣的IDE,你會(huì )發(fā)現效率得到明顯提高,IDE可以自動(dòng)閉合,補全分號并且可以在本地debug。
6. 利用好PHP的過(guò)濾函數 – Joey Sochacki
或許Joey Sochacki并不像Matt Mullenweg那樣有名 ,但他也是一個(gè)經(jīng)驗豐富的開(kāi)發(fā)者,并且通過(guò)他的博客Devolio分享了很多技術(shù)經(jīng)驗
Joey發(fā)現在編寫(xiě)php代碼的過(guò)程中有很多地方需要進(jìn)行過(guò)濾,但卻并沒(méi)有太多的coder關(guān)注php的內置過(guò)濾函數。
過(guò)濾數據是我們經(jīng)常需要做的事情,但是很多功能豐富的PHP內置過(guò)濾函數卻不為人知。使用類(lèi)似filter_* 的PHP內置函數,我們幾乎可以處理所有的過(guò)濾任務(wù),包括數據類(lèi)型驗證/URL/email和IP地址驗證/特殊字符處理等等。
對于是否應該使用Zend, CakePHP, Code Igniter, 或者 其他PHP框架,一直存在著(zhù)很多爭議,但是在web開(kāi)發(fā)者的心中,他們有自己衡量的標準。
Josh Sharp自己創(chuàng )建了一家提供面包和黃油服務(wù)的網(wǎng)站,因此他對于使用PHP框架來(lái)開(kāi)發(fā)網(wǎng)站有一定的經(jīng)驗。他認為使用一個(gè)PHP框架來(lái)進(jìn)行項目開(kāi)發(fā)(use a PHP framework ),可以有效地節省時(shí)間,并且減少出錯的幾率。為什么?因為他覺(jué)得PHP實(shí)在是太好上手了。
PHP的易于使用有時(shí)候也有缺陷,因為并不嚴格的語(yǔ)法,經(jīng)常會(huì )導致很多錯誤代碼的誕生。但如果使用一個(gè)PHP框架,出錯的幾率就會(huì )大大減少。
PHP框架可以讓你的代碼結構更加規范,并且節省大量時(shí)間。
8. 不要使用PHP框架 – Rasmus Lerdorf
與Josh的觀(guān)點(diǎn)恰恰相反,PHP的鼻祖Rasmus Lerdorf卻認為最好不要使用PHP框架,為什么?因為不基于框架的PHP性能更好。Rasmus在Drupalcon 2008的演講上,用“Hello World”的例子來(lái)對比了一些框架PHP和簡(jiǎn)單PHP之間的性能,結果顯示框架PHP的性能要遠遠落后。
9. 使用批處理 – Jack D. Herrington
Jack Herrington對PHP世界并不陌生, 并且為大名鼎鼎的IBM developerWorks貢獻過(guò)超過(guò)30篇的專(zhuān)搞, 同時(shí)出版過(guò)《PHP Hacks》的書(shū),因此他是一個(gè)真正的專(zhuān)家。
Herrington推薦使用批處理和Cron來(lái)代替那些可以運行在后臺的程序腳步,Web用戶(hù)并不愿意在線(xiàn)等待你的處理過(guò)程,所以有些事情更適合放到后臺來(lái)處理。
誠然,在某些情況下,這有點(diǎn)大材小用了,但是你可以清楚地看到,使用Cron, MySQL, PHP面向對象的方法以及Pear::DB這些便捷的工具來(lái)創(chuàng )建一個(gè)批處理工具并不是一件復雜的事情。
Jack認為使用cron, PHP和MySQL在后臺處理一些任務(wù),比起多進(jìn)程的業(yè)務(wù)邏輯要劃算得多。
兩種方法我都嘗試過(guò),我認為Cron非常符合”Keep It Simple, Stupid” (KISS) 的原則,它讓后臺處理變得簡(jiǎn)單。與多進(jìn)程的業(yè)務(wù)邏輯相比,它沒(méi)有內存溢出的風(fēng)險。你可以創(chuàng )建一個(gè)簡(jiǎn)單的批處理腳本,并且在cron中運行,這個(gè)腳本會(huì )定時(shí)檢查是否有任務(wù)需要處理,處理完之后就會(huì )自動(dòng)退出,因此你不用擔心是否有進(jìn)程卡殼,或者陷入死循環(huán)。
10. 及時(shí)啟用錯誤報告 – David Cummings
David Cummings有一個(gè)專(zhuān)門(mén)提供CMS軟件服務(wù)的公司 ,并且獲得過(guò)幾次獎 ,他有非常豐富的PHP開(kāi)發(fā)經(jīng)驗。David曾經(jīng)寫(xiě)過(guò)《two PHP tips he wished he’d learned in the beginning》,其中一點(diǎn)就是:及時(shí)啟用錯誤報告,這會(huì )節省大量的時(shí)間。
我告訴人們,最重要的事情就是最大程度地開(kāi)啟PHP的錯誤報告,為什么?因為PHP可能會(huì )隱藏很多小問(wèn)題:
◆變量沒(méi)有預定義
◆在代碼片段中引用了不可用的變量
◆使用了未定義的常量這些因素看起來(lái)并不是什么大事,除非你在使用面向對象的方法編寫(xiě)一些類(lèi)庫。通常,關(guān)閉錯誤報告將可能使你付出更大的成本來(lái)維護你的代碼。
錯誤報告可以幫你輕易地找到代碼的問(wèn)題所在,如果錯誤報告的等級夠高,細微的錯誤都能被立即發(fā)現,幫助你節省整體debug的時(shí)間。
聯(lián)系客服