高效率的PHP寫法(變數+陣列+架構)

變數+陣列+架構
變數
4.1 及時銷燬變數
陣列、物件和GLOBAL變數在 PHP 中特別佔記憶體的,這個由於 PHP 的底層的zend引擎引起的。
一般來說,PHP陣列的記憶體利用率只有1/10。
也就是說,一個在C語言裡面100M 記憶體的陣列,在PHP裡面就要1G。
特別是,在PHP作為後臺伺服器的系統中,經常會出現記憶體耗費太大的問題。
4.2 使用$_SERVER變數
如果你需要得到指令碼執行的時間,$_SERVER['REQUSET_TIME']優於time()。
一個是現成就可以直接用,一個還需要函式得出的結果。
4.3 方法裡建立區域性變數
在類的方法裡建立區域性變數速度最快,幾乎和在方法裡呼叫區域性變數一樣快。
4.4 區域性變數比全域性變數快
由於區域性變數是 存在棧中 的。
當一個函式佔用的棧空間不是很大的時候,這部分記憶體很有可能全部命中cache,CPU訪問的效率是很高的。
相反,如果一個函式同時使用全域性變數和區域性變數,當這兩段地址相差較大時,cpu cache需要來回切換,效率會下降。
4.5 區域性變數而不是物件屬性
建立一個物件屬性(類裡面的變數,例如:$this->prop++)比區域性變數要慢3倍。
4.6 提前宣告區域性變數
建立一個未宣告的區域性變數,要比建立一個已經定義過的區域性變數慢9-10倍。
4.7 謹慎宣告全域性變數
宣告一個未被任何一個函式使用過的全域性變數,也會使效能降低。
這和宣告相同數量的區域性變數一樣,PHP可能去檢查這個全域性變數是否存在。
4.8 使用 ++$i 遞增
當執行變數$i的遞增或遞減時,$i++會比++$i慢一些。
這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java程式碼,並指望它們能立即變快,沒用的。
++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。
後置遞增實際上會產生一個臨時變數,這個臨時變數隨後被遞增。
而前置遞增直接在原值上遞增。
這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。
牢記,這個優化處理不失為一個好主意,因為不是所有的指令優化器都會做同樣的優化處理。
4.9 不要隨便複製變數
有時候為了使 PHP 程式碼更加整潔,一些 PHP 新手(包括我)會把預定義好的變數,複製到一個名字更簡短的變數中。
其實這樣做的結果是增加了一倍的記憶體消耗,只會使程式更加慢。
試想一下,在下面的例子中,如果使用者惡意插入 512KB位元組的文字,就會導致 1MB 的記憶體被消耗!

4.10 迴圈內部不要宣告變數
尤其是大變數,這好像不只是PHP裡面要注意的問題吧?
4.11 一定要對變數進行初始化
這裡的“初始化”指的是“宣告”。
當需要沒有初始化的變數,PHP直譯器會自動建立一個變數,但依靠這個特性來程式設計並不是一個好主意。
這會造成程式的粗糙,或者使程式碼變得另人迷惑。
因為你需要探尋這個變數是從哪裡開始被建立的。
另外,對一個沒有初始化的變數進行遞增操作要比初始化過的來得慢。
所以對變數進行初始化會是個不錯的主意。
5.1 用字串而不是陣列作為引數
如果一個函式既能接受陣列,又能接受簡單字元做為引數,那麼儘量用字元作為引數。
例如,字元替換函式,引數列表並不是太長,就可以考慮額外寫一段替換程式碼。
使得每次傳遞引數都是一個字元,而不是接受陣列做為查詢和替換引數。
5.2 陣列元素加引號
$row['id']比$row[id]速度快7倍。
如果不帶引號,例如$a[name],那麼PHP會首先檢查有沒有define定義的name常量。
如果有,就用這個常量值作為陣列鍵值。如果沒有,再查詢鍵值為字串'name'的陣列元素。
多了一個查詢判斷的過程,所以建議養成陣列鍵名加引號的習慣。
正如上面字串部分所述,用'又比用"速度更快。
5.3 多維陣列操作
多維陣列儘量不要迴圈巢狀賦值。
5.4 迴圈用foreach
儘量用foreach代替while和for迴圈,效率更高。
6.1 壓縮輸出
在php.ini中開啟gzip壓縮:

level可能是1-9之間的數字,你可以設定不同的數字。
幾乎所有的瀏覽器都支援Gzip的壓縮方式,gzip可以降低80%的輸出.
付出的代價是,大概增加了10%的cpu計算量。
但是還是會賺到了,因為頻寬減少了,頁面載入會變得很快。
如果你使用apache,也可以啟用mod_gzip模組。
6.2 靜態化頁面
Apache/Nginx解析一個PHP指令碼的時間,要比解析一個靜態HTML頁面慢2至10倍。
所以儘量使頁面靜態化,或使用靜態HTML頁面。
6.3 將PHP升級到最新版
提高效能的最簡單的方式是不斷升級、更新PHP版本。
6.4 利用PHP的擴充套件
一直以來,大家都在抱怨PHP內容太過繁雜。
最近幾年來,開發人員作出了相應的努力,移除了專案中的一些冗餘特徵。
即便如此,可用庫以及其它擴充套件的數量還是很可觀。
甚至一些開發人員開始考慮實施自己的擴充套件方案。
6.5 PHP快取
一般情況下,PHP指令碼被PHP引擎編譯後執行,會被轉換成機器語言,也稱為操作碼。
如果PHP指令碼反覆編譯得到相同的結果,為什麼不完全跳過編譯過程呢?
PHP加速器快取了編譯後的機器碼,允許程式碼根據要求立即執行,而不經過繁瑣的編譯過程。
對PHP開發人員而言,目前提供了兩種可用的快取方案。
一種是APC(Alternative PHP Cache,可選PHP快取),它是一個可以通過PEAR安裝的開源加速器。
另一種流行的方案是OPCode,也就是操作碼快取技術。
6.6 使用NoSQL快取
Memchached或者Redis都可以。
這些是高效能的分散式記憶體物件快取系統,能提高動態網路應用程式效能,減輕資料庫的負擔。
這對運算碼 (OPcode)的快取也很有用,使得指令碼不必為每個請求重新編譯。