經驗之談:10位頂級PHP大師的開發原則

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

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

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

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

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

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

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

2. 使用多表存儲提高規模伸縮性——Matt Mullenweg

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

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

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

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

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

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

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

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

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

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

4. 多使用PHP緩存——Ben Balbo

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

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

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

緩存函數的運行結果

設置過期時間

緩存IE下載的文件

模板緩存技術

Cache_Lite

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

5. 使用IDE, Templates和Snippets加速PHP開發——Chad Kieffer

當Chad Kieffer從UI設計和數據庫優化的工作中抽身出來的時候,他會在他的博客2 tablespoons上分享很多技術經驗。由于Chad多方面的全面發展,他經常可以發現其他程序員不能發現的問題,并形成相關經驗,尤其是他開發網站的方法。他參與了網站開發的各個環節,因此他的建議對于提高網站開發的大局觀非常有用。

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

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

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

6. 利用好PHP的過濾函數——Joey Sochacki

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

Joey發現在編寫php代碼的過程中有很多地方需要進行過濾,但卻并沒有太多的coder關注php的內置過濾函數。

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

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

7. 使用PHP框架——Josh Sharp

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

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

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

PHP框架可以讓你的代碼結構更加規范,并且節省大量時間。

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

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

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

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

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

誠然,在某些情況下,這有點大材小用了,但是你可以清楚地看到,使用Cron, MySQL, PHP面向對象的方法以及Pear::DB這些便捷的工具來創建一個批處理工具并不是一件復雜的事情。

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

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

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

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

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

變量沒有預定義

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

使用了未定義的常量這些因素看起來并不是什么大事,除非你在使用面向對象的方法編寫一些類庫。通常,關閉錯誤報告將可能使你付出更大的成本來維護你的代碼。

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

轉載于:https://www.cnblogs.com/clphp/p/5082337.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458513.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

#Pragma Pack(n)與內存分配 pragma pack(push,1)與#pragma pack(1)的區別

from:http://blog.csdn.net/mylinx/article/details/7007309 #pragma pack(n) 解釋一: 每個特定平臺上的編譯器都有自己的默認“對齊系數”(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n1,2,4,8,16來改變這一系數,…

ShowDoc的搭建

其實,官方文檔也說的很清楚了。主要貼一下我遇見的問題。環境:LNMP(LAMP沒試過,有興趣的同學可以試試,然后發出來)PHP5.3以上版本、php-mbstring模塊、php-pdo模塊、mysql數據庫克隆或者下載代碼&#xff1…

BroadcastReceiver

本文介紹Broadcast Receiver,包括幾部分內容:Broadcast Receiver概述及實例、自定義Broadcast Receiver、Broadcast Receiver的實現細節、生命周期等。 csdn貌似今天出問題了,無法上傳圖片。 資料來源:最牛網,《官方解…

如何確定VS編譯器版本--_MSC_VER || #if _MSC_VER 1000 #pragma once #endif

如何確定VS編譯器版本 _MSC_VER是MSVC編譯器的內置宏,定義了編譯器的版本,_MSC_VER 值對應版本關系 MSVC 11.0 _MSC_VER 1700 (Visual Studio 2012) MSVC 10.0 _MSC_VER 1600 (Visual Studio 2010) MSVC 9.0 _MSC_VER 1500 (Visual Studio 2008) …

NIO復習02

Selector 1. Selector(選擇器)是Java NIO中能夠檢測一到多個NIO通道,并能夠知曉通道是否為諸如讀寫事件做好準備的組件。這樣,一個單獨的線程可以管理多個channel,從而管理多個網絡連接。 2. Selector的創建&#xff1…

c/c++標準預定義宏

C標準中的一些預定義宏昨天寫代碼時需要在代碼獲取當前編譯時間,從而可動態地作為版本信息,因此用到了C標準中的一些預定義的宏。在此將C標準中定義的幾個宏一并總結一下: __DATE__ 進行預處理的日期(“Mmm dd yyyy”形式的字符串…

安裝cocoa pods時出現Operation not permitted - /usr/bin/xcodeproj的問題

在更新完ruby,更換Ruby鏡像--淘寶的那個鏡像(https://ruby.taobao.org/ )已經不可用了。官方的需要FQ。所以我們現在用最新支持的ruby鏡像(https://gems.ruby-china.org/) 安裝cocoa pods時, 在命令行中輸入: 安裝&…

js 日期控件laydate使用

官網 http://sentsin.com/layui/laydate/ 1. 下載官網上的壓縮包,解壓后只需要復制laydate 文件夾到你的項目中; 2. 在頁面引入 <script type"text/javascript" src"js/laydate/laydate.js"></script> 3. 在頁面添加: <div class"i…

老李推薦:第8章2節《MonkeyRunner源碼剖析》MonkeyRunner啟動運行過程-解析處理命令行參數 2...

我們這一節會先去分析下monkeyrunner是如何對參數進行處理的&#xff0c;我們跳轉到MonkeyRunnerOptions這個類里面的processOptions這個方法&#xff1a; 93 public static MonkeyRunnerOptions processOptions(String[] args) 94 { 95 int index 0; 96 97 Strin…

MFC CPropertySheet 多頁面切換 實例

為了能實現在同一個頁面實現多個頁面的切換效果。CPropertySheet要與CPropertyPage一起使用。 首先 新建一個MFC工程--MFC AppWizard(exe), 取名Pagesheet, 選擇Dialog based, 然后Finish. 2. 在對話框資源中插入兩個對話框IDD_DIALOG1、IDD_DIALOG2&#xff0c;作為…

ReactiveCocoa簡單介紹

ReactiveCocoa 的簡單介紹 http://www.jianshu.com/p/87ef6720a096

游戲提高性能 游戲降幀處理

什么是降幀&為什么降幀 一般情況下我們為了提高整個游戲的體驗&#xff0c;所以我們一般會將游戲的幀數&#xff08;每秒鐘刷新多少次&#xff09;設置的比較高。一般情況下&#xff0c;我們的游戲所有的代碼都是一幀執行一次。為了讓每一幀都變成真的關鍵數據幀。不過&…

delphi 更改DBGrid 顏色技巧

1、根據條件更改某一單元格的顏色 [delphi] view plaincopy procedure TMainFrm.First_DGDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if DM.FirstListStatus.AsString生產 then begin …

mfc中UpdateData的用法

http://blog.csdn.net/ddjj_1980/article/details/51452289 UpdateData(TRUE)——刷新控件的值到對應的變量。(外部輸入值交給內部變量)即&#xff1a;控件的值—>變量。UpdateData(FALSE)—— 拷貝變量值到控件顯示。(變量的最終運算結果值交給外部輸出顯示)即&#xff1a;…

動畫類的層次結構

CASpringAnimation類是CAABasicAnimation的子類 CAPropertyAnimation &#xff1a;是CAAnimation的子類&#xff0c;它支持動畫地顯示圖層的keyPath&#xff0c;一般不直接使用。 iOS9.0之后新增CASpringAnimation類&#xff0c;它實現彈簧效果的動畫&#xff0c;是CABasicAnim…

[原]小命令大作用:modprobe

調整網絡為綁定模式&#xff0c;但啟動時候會報錯&#xff0c;此時執行命令 modprobe bonding 可以解決問題。 之前在磁盤方面遇到問題也是通過modprobe命令解決的&#xff0c;又遇到這個命令&#xff0c;似曾相識。于是看下該命令&#xff1a; Linux命令&#xff1a;modprobe …

sql語句優化之not in

多表關聯想查a表中除去b表的可用not exists 效率比not in 更高 優化后的語句用時0.421秒 select john.*, (case when round((case john.sumcount when 0 then 0 else mycount * 100 / sumcount end), 2) > 100 then 100 else round((case john.sumcount when 0 then 0 else …

setup2go制作安裝程序

QT程序設計完畢時&#xff0c;我們就要發布自己的程序&#xff0c;發布程序有兩種方法&#xff1a;一是靜態編譯&#xff0c;二是制作程序安裝包。 靜態編譯好麻煩&#xff0c;我從來沒有成功過&#xff0c;所以我用了動態編譯方法&#xff0c;設計完成時&#xff0c;用release…

gson-2.2.api簡單

使用gson的tojson和fromjson實現對象和json的轉換 Gson gson new Gson(); // Or use new GsonBuilder().create(); MyType target new MyType(); String json gson.toJson(target); // serializes target to Json MyType target2 gson.fromJson(json, MyType.c…