2016.02.01 PHP 的 10 種最佳實踐

在 WEB 開發(fā)世界里,PHP 是最流行的語言之一,從 PHP 里,你能夠很容易的找到你所需的腳本,遺憾的是,很少人會去用“最佳做法”去寫一個 PHP 程序。這里,我們向大家介紹 PHP 的 10 種最佳實踐,當然,每一種都是經(jīng)過大師們證明而得出的。

1. 在合適的時候使用 PHP – Rasmus Lerdorf

沒有誰比 PHP 的創(chuàng)建者 Rasmus Lerdorf 明白 PHP 用在什么地方是更合理的,他于 1995 年發(fā)布了 PHP 這門語言,從那時起,PHP 就像燎原之火,燒遍了整個開發(fā)陣營,改變了互聯(lián)網(wǎng)的世界??墒?,Rasmus 并不是因此而創(chuàng)建 PHP 的。PHP 是為了解決 WEB 開發(fā)者的實際問題而誕生的。

和許多開源項目一樣,PHP 變得流行,流行的動機并不能用正常的哲學來進行解釋,甚至流行得有些孤芳自賞。它完全可以作為一個案例,一個解決各種 Web 問題的工具需求所引起的案例,因此當 PHP 剛出現(xiàn)的時候,這種工具需求全部聚焦到 PHP 的身上。

但是,你不能奢望 PHP 可以解決所有問題。Lerdorf 是第一個承認 PHP 只是一種工具的人,并且 PHP 也有很多力所不能及的情況。

根據(jù)工作的不同來選擇合適的工具。我跑了很多家公司,為了說服他們部署和使用 PHP,但是這并不意味著 PHP 對所有問題都適用。它只是可以一個解決大部分問題的 front-end 腳步語言。

作為一個 web 開發(fā)者,嘗試用 PHP 解決所有問題是不科學的,同時也會浪費你的時間。當 PHP 玩不轉(zhuǎn)的時候,不要猶豫,試用一下其他的語言吧。

2. 使用多表存儲提高規(guī)模伸縮性 – Matt Mullenweg

沒有人愿意質(zhì)疑 Matt Mullenweg 在 PHP 方面的權(quán)威性,他開發(fā)了這個星球上最流行的 blog 系統(tǒng),(依靠一個強大的社區(qū)力量支持): WordPress. 創(chuàng)建 Wordpress 以后,Matt 和他的團隊啟動了 WordPress.com 平臺,一個基于 WordPress MU 的免費 blog 站點。現(xiàn)在,Wordpress.com 已經(jīng)擁有大約 400 萬用戶, 這些用戶每天提供超過 140,000 篇的日志。

如果有人知道如何讓網(wǎng)站的規(guī)模伸縮自如,這個人一定是 Matt Mullenweg。2006 年的時候 Matt 對 Wordpress 的數(shù)據(jù)結(jié)構(gòu)進行了前瞻性的改進,并且解釋了為什么 Wordpress MU 對每個 blog 使用獨立的 MYSQL 表格, 而不是把所有的 blog 數(shù)據(jù)都塞進一個巨大的表格。

我們測試過這個方法,但是發(fā)現(xiàn)如果要擴展它的伸縮性,代價太高。如果用一個整體的數(shù)據(jù)結(jié)構(gòu),在大流量面前,你將會面臨服務(wù)器硬件的問題。在 MU 里面。用戶們都被分布到獨立的表格當中,并且可以輕易地組織起來。舉個例子,WordPress.com 把用戶的數(shù)據(jù)分散存儲到 4096 個數(shù)據(jù)庫中,這些數(shù)據(jù)庫可以分散大規(guī)模的數(shù)據(jù)訪問,實現(xiàn)流量和壓力分流。

數(shù)據(jù)表的可遷移性讓代碼(blog)可以運行得更快,并且讓系統(tǒng)具備更強的伸縮性。依靠強大的緩存策略和靈活的數(shù)據(jù)庫運用策略, Matt 向人們展示了時下最流行的 Facebook 和 Wordpress.com 都可以在 PHP 下穩(wěn)定運行,并且處理驚人的訪問量。

3. 千萬不要相信用戶 – Dave Child

Dave Child 是 Added Bytes (previously ilovejackdaniels.com) 網(wǎng)站的核心人物,這個網(wǎng)站以他出色的《cheat sheets for many programming languages》而聞名。 Dave 為很多英國的公司服務(wù),并且已經(jīng)在編程世界里樹立起相當?shù)臋?quán)威。

Dave 為 PHP 開發(fā)者提供了很多深謀遠慮的建議,并總結(jié)成了《writing secure code in PHP》:千萬不要相信你的用戶,他們甚至可能會傷害你。

有一條 web 開發(fā)的基本原則,我重復多少遍都覺得不夠,那就是:千萬不要相信你的用戶,同時要假設(shè)你網(wǎng)站中的每個數(shù)據(jù)單元都是從用戶那里收集來的惡意代碼。很多時候,你必須用 JAVAscript 在客戶端檢驗表單提交過來的內(nèi)容, 如果你習慣了如此,那么,這是一個好習慣。如果安全性對你來說很重要,這就是最重要最需要學習的原則。

Dave 目前正致力于為它的《Writing Secure PHP》系列書籍整理實例,書的最后他說:

最后,變得偏執(zhí)一點吧。除非你認為你的站點永遠不會受到攻擊,否則就正視所有的問題,當問題真正發(fā)生的時候,你的情況會變得很糟。你需要把每個用戶都看成會帶來一場攻防站的黑客,想盡一切辦法來保護站點的安全,同時想好相應(yīng)問題的解決方案。

4. 多使用 PHP 緩存 – Ben Balbo

Ben Balbo 開發(fā)了 Site Point,一個為 developers 和 designers 提供指導的網(wǎng)站。他是墨爾本 PHP 開發(fā)和開源俱樂部的成員, 因此他對 PHP 有一定的了解,同時對 PHP caching 有一定的想法和經(jīng)驗。

如果你擁有一個訪問量很大,但更新并不頻繁的站點(比如 blog,基于某種 CMS),或許它需要進行一些改造,這些改造不會花費太多的時間,但是對性能有突出的貢獻。 如果要為一個復雜/更新頻率很快的站點建立緩存機制,過程可能會很曲折,但是好處也是顯而易見的。

PHP 緩存技術(shù)有很多種,Ben 為我們推薦了如下一些:

緩存函數(shù)的運行結(jié)果

設(shè)置過期時間

緩存 IE 下載的文件

模板緩存技術(shù)

Cache_Lite

由于 PHP 作為動態(tài)語言的特性,緩存機制對于更新頻率并不快的站點來說非常重要。

5. 使用 IDE, Templates 和 Snippets 加速 PHP 開發(fā) – Chad Kieffer

當 Chad Kieffer 從 UI 設(shè)計和數(shù)據(jù)庫優(yōu)化的工作中抽身出來的時候,他會在他的博客 2 tablespoons 上分享很多技術(shù)經(jīng)驗。由于 Chad 多方面的全面發(fā)展,他經(jīng)常可以發(fā)現(xiàn)其他程序員不能發(fā)現(xiàn)的問題,并形成相關(guān)經(jīng)驗,尤其是他開發(fā)網(wǎng)站的方法。他參與了網(wǎng)站開發(fā)的各個環(huán)節(jié),因此他的建議對于提高網(wǎng)站開發(fā)的大局觀非常有用。

Chad 認為使用 Eclipse PDT (Eclipse’s PHP development package) 這樣的 IDE,同時使用一些模板技術(shù)和開源項目可以有效地提高 PHP 的開發(fā)速度。

緊湊的計劃,長長的 to do lists 以及 deadlines 讓開發(fā)人員非??鄲?。不過有些功能,比如 Eclipse Templates,可以有效減少編碼的時間和出錯的幾率。

通常來說,任何項目都可以自動化,自動化程度越高, 你完成項目的時間就越短。花時間來開發(fā)使用頻率很高的框架和模板,將會節(jié)省你以后更多時間。同時,使用像 Eclipse and the PDT package 這樣的 IDE,你會發(fā)現(xiàn)效率得到明顯提高,IDE 可以自動閉合,補全分號并且可以在本地 debug。

6. 利用好 PHP 的過濾函數(shù) – Joey Sochacki

或許 Joey Sochacki 并不像 Matt Mullenweg 那樣有名 ,但他也是一個經(jīng)驗豐富的開發(fā)者,并且通過他的博客 Devolio 分享了很多技術(shù)經(jīng)驗

Joey 發(fā)現(xiàn)在編寫 php 代碼的過程中有很多地方需要進行過濾,但卻并沒有太多的 coder 關(guān)注 php 的內(nèi)置過濾函數(shù)。

過濾數(shù)據(jù)是我們經(jīng)常需要做的事情,但是很多功能豐富的 PHP 內(nèi)置過濾函數(shù)卻不為人知。使用類似 filter_* 的 PHP 內(nèi)置函數(shù),我們幾乎可以處理所有的過濾任務(wù),包括數(shù)據(jù)類型驗證/URL/email 和 IP 地址驗證/特殊字符處理等等。

過濾是一件復雜的事情,但是我相信 joey 的發(fā)現(xiàn)會給你很多啟發(fā),讓你認識到 PHP 強大的過濾功能。

7. 使用 PHP 框架 – Josh Sharp

對于是否應(yīng)該使用 Zend, CakePHP, Code Igniter, 或者其他 PHP 框架,一直存在著很多爭議,但是在 web 開發(fā)者的心中,他們有自己衡量的標準。

Josh Sharp 自己創(chuàng)建了一家提供面包和黃油服務(wù)的網(wǎng)站,因此他對于使用 PHP 框架來開發(fā)網(wǎng)站有一定的經(jīng)驗。他認為使用一個 PHP 框架來進行項目開發(fā)(use a PHP framework ),可以有效地節(jié)省時間,并且減少出錯的幾率。為什么?因為他覺得 PHP 實在是太好上手了。

PHP 的易于使用有時候也有缺陷,因為并不嚴格的語法,經(jīng)常會導致很多錯誤代碼的誕生。但如果使用一個 PHP 框架,出錯的幾率就會大大減少。

PHP 框架可以讓你的代碼結(jié)構(gòu)更加規(guī)范,并且節(jié)省大量時間。

8. 不要使用 PHP 框架 – Rasmus Lerdorf

與 Josh 的觀點恰恰相反,PHP 的鼻祖 Rasmus Lerdorf 卻認為最好不要使用 PHP 框架,為什么?因為不基于框架的 PHP 性能更好。Rasmus 在 Drupalcon 2008 的演講上,用“Hello World”的例子來對比了一些框架 PHP 和簡單 PHP 之間的性能,結(jié)果顯示框架 PHP 的性能要遠遠落后。

9. 使用批處理 – Jack D. Herrington

Jack Herrington 對 PHP 世界并不陌生, 并且為大名鼎鼎的 IBM developerWorks 貢獻過超過 30 篇的專搞, 同時出版過《PHP Hacks》的書,因此他是一個真正的專家。

Herrington 推薦使用批處理和 Cron 來代替那些可以運行在后臺的程序腳步,Web 用戶并不愿意在線等待你的處理過程,所以有些事情更適合放到后臺來處理。

誠然,在某些情況下,這有點大材小用了,但是你可以清楚地看到,使用 Cron, MySQL, PHP 面向?qū)ο蟮姆椒ㄒ约?Pear::DB 這些便捷的工具來創(chuàng)建一個批處理工具并不是一件復雜的事情。

Jack 認為使用 cron, PHP 和 MySQL 在后臺處理一些任務(wù),比起多進程的業(yè)務(wù)邏輯要劃算得多。

兩種方法我都嘗試過,我認為 Cron 非常符合”Keep It Simple, Stupid” (KISS) 的原則,它讓后臺處理變得簡單。與多進程的業(yè)務(wù)邏輯相比,它沒有內(nèi)存溢出的風險。你可以創(chuàng)建一個簡單的批處理腳本,并且在 cron 中運行,這個腳本會定時檢查是否有任務(wù)需要處理,處理完之后就會自動退出,因此你不用擔心是否有進程卡殼,或者陷入死循環(huán)。

10. 及時啟用錯誤報告 – David Cummings

David Cummings 有一個專門提供 CMS 軟件服務(wù)的公司 ,并且獲得過幾次獎 ,他有非常豐富的 PHP 開發(fā)經(jīng)驗。David 曾經(jīng)寫過《two PHP tips he wished he’d learned in the beginning》,其中一點就是:及時啟用錯誤報告,這會節(jié)省大量的時間。

我告訴人們,最重要的事情就是最大程度地開啟 PHP 的錯誤報告,為什么?因為 PHP 可能會隱藏很多小問題:

變量沒有預定義

在代碼片段中引用了不可用的變量

使用了未定義的常量這些因素看起來并不是什么大事,除非你在使用面向?qū)ο蟮姆椒ň帉懸恍╊悗?。通常,關(guān)閉錯誤報告將可能使你付出更大的成本來維護你的代碼。

錯誤報告可以幫你輕易地找到代碼的問題所在,如果錯誤報告的等級夠高,細微的錯誤都能被立即發(fā)現(xiàn),幫助你節(jié)省整體 debug 的時間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容