摘要:內(nèi)置函數(shù)的性能優(yōu)劣。產(chǎn)生額外開銷的錯誤抑制符號,最好別用不管是性能優(yōu)化和項目的健壯性等方面。在方法中遞增局部變量,速度是最快的。類似的方法調(diào)用所花費的時間接近于次的局部變量遞增操作。
什么情況之下,會遇到PHP性能問題?
1:PHP語法使用不恰當(dāng)。
2:使用PHP語言做了它不擅長的事情。
3:使用PHP語言連接的服務(wù)不給力。
4:PHP自身的短板(PHP自身做不了的事情)。
5:我們也不知道的問題?(去探索、分析找到解決辦法,提升開發(fā)境界)。
對線上站點做壓力測試的時候,我們一定要將請求數(shù)和并發(fā)數(shù),特別是并發(fā)數(shù)要設(shè)置的比較低,我們不能對線上的網(wǎng)站造成壓力問題,不管是自己的還是別人的。
PHP性能問題一般不會超過占整個項目性能的50%,一般在30%~40%。
PHP性能問題的解決方向,三個層級。
1:PHP語言級的性能優(yōu)化,指的是PHP語法基本功能,這部分優(yōu)化比較簡單易見、快速可行,比較快速看到效果。
a:少寫PHP的代碼,多用PHP自身能力解決問題。
性能問題:
自寫代碼冗余較多,可讀性不佳,并且性能低,如代碼很長很長...PHP代碼越長PHP的執(zhí)行效率越慢。為什么性能低?
PHP代碼需要解析編譯為C語言,底層C語言又要編譯成匯編語言機器語言才能執(zhí)行,這個過程在每次請求過來之后都要處理一遍,所以開銷很大(項目變大的話...)。
解決方法:
多使用PHP內(nèi)置的變量、常量、函數(shù)。我們用PHP代碼實現(xiàn)的功能和使用PHP內(nèi)置的函數(shù)實現(xiàn)的同樣功能差別是有的。
b:PHP內(nèi)置函數(shù)的性能優(yōu)劣。
情況描述
PHP內(nèi)置函數(shù)之間依然存在快慢差別;少用PHP魔術(shù)方法;
建議:
多去了解PHP內(nèi)置函數(shù)的執(zhí)行實現(xiàn)復(fù)雜度。
測試方法:比較效率測試,如用microtime()函數(shù),取差值,精確到毫秒級別;Linux的time命令可以查看開銷。
c:產(chǎn)生額外開銷的錯誤抑制符號“@”,最好別用(不管是性能優(yōu)化和項目的健壯性等方面)。
@的邏輯是在代碼前和代碼結(jié)束后增加了Opcode,Opcode的作用就是忽略報錯,其實就是相當(dāng)于增加了error_reporting設(shè)置,等級報錯為忽略(vld擴展可以查看被隱藏的Opcode);
d:合理使用內(nèi)存。
情況描述: PHP有內(nèi)存回收機制保底,但是也小心使用內(nèi)存;
建議:
利用unset()及時釋放不使用的內(nèi)存,比如一些數(shù)據(jù)庫多余字段(注意:unset()有時會出現(xiàn)注銷不掉的情況)
e:盡量少用正則表達式。
情況描述:
正則表達式的開銷大,使用起來簡單,但是性能低因為,正則表達式需要回溯;正則表達式越長,回溯的開銷越大,優(yōu)化正則表達式是需要技術(shù)水平的,正則技術(shù)不達標(biāo),不要亂用正則。
f:避免在循環(huán)內(nèi)做運算。
情況描述:
循環(huán)內(nèi)的計算式將被重復(fù)計算(我們在for循環(huán)或者while循環(huán),會有重復(fù)計算,影響性能問題)。
舉例:
錯誤用法:
$str = "hello world";
for($i = 0; $i < strlen($str); $i ++){ ...}
以下是我在其他博文收集的
1、如果能將類的方法定義成static,就盡量定義成static,它的速度會提升將近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、注銷那些不用的變量尤其是大數(shù)組,以便釋放內(nèi)存。
4、盡量避免使用__get,__set,__autoload。
5、require_once()代價昂貴。
6、include文件時盡量使用絕對路徑,因為它避免了PHP去include_path里查找文件的速度,解析操作系統(tǒng)路徑所需的時間會更少。
7、如果你想知道腳本開始執(zhí)行(譯注:即服務(wù)器端收到客戶端請求)的時刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()
8、函數(shù)代替正則表達式完成相同功能。
9、str_replace函數(shù)比preg_replace函數(shù)快,但strtr函數(shù)的效率是str_replace函數(shù)的四倍。
10、如果一個字符串替換函數(shù),可接受數(shù)組或字符作為參數(shù),并且參數(shù)長度不太長,那么可以考慮額外寫一段替換代碼,使得每次傳遞參數(shù)是一個字符,而不是只寫一行代碼接受數(shù)組作為查詢和替換的參數(shù)。
11、使用選擇分支語句(譯注:即switch case)好于使用多個if,else if語句。
12、用@屏蔽錯誤消息的做法非常低效,極其低效。
13、打開apache的mod_deflate模塊,可以提高網(wǎng)頁的瀏覽速度。
14、數(shù)據(jù)庫連接當(dāng)使用完畢時應(yīng)關(guān)掉,不要用長連接。
15、在方法中遞增局部變量,速度是最快的。幾乎與在函數(shù)中調(diào)用局部變量的速度相當(dāng)。遞增一個全局變量要比遞增一個局部變量慢2倍。遞增一個對象屬性(如:$this->prop++)要比遞增一個局部變量慢3倍。遞增一個未預(yù)定義的局部變量要比遞增一個預(yù)定義的局部變量慢9至10倍。
16、僅定義一個局部變量而沒在函數(shù)中調(diào)用它,同樣會減慢速度(其程度相當(dāng)于遞增一個局部變量)。PHP大概會檢查看是否存在全局變量。
17、方法調(diào)用看來與類中定義的方法的數(shù)量無關(guān),因為我(在測試方法之前和之后都)添加了10個方法,但性能上沒有變化。
18、派生類中的方法運行起來要快于在基類中定義的同樣的方法。
19、調(diào)用帶有一個參數(shù)的空函數(shù),其花費的時間相當(dāng)于執(zhí)行7至8次的局部變量遞增操作。類似的方法調(diào)用所花費的時間接近于15次的局部變量遞增操作。
20、Apache解析一個PHP腳本的時間要比解析一個靜態(tài)HTML頁面慢2至10倍。盡量多用靜態(tài)HTML頁面,少用腳本。
21、除非腳本可以緩存,否則每次調(diào)用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷。
22、盡量做緩存,可使用memcached。memcached是一款高性能的內(nèi)存對象緩存系統(tǒng),可用來加速動態(tài)Web應(yīng)用程序,減輕數(shù)據(jù)庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯。
23、當(dāng)操作字符串并需要檢驗其長度是否滿足某種要求時,你想當(dāng)然地會使用strlen()函數(shù)。此函數(shù)執(zhí)行起來相當(dāng)快,因為它不做任何計算,只返回在zval 結(jié)構(gòu)(C的內(nèi)置數(shù)據(jù)結(jié)構(gòu),用于存儲PHP變量)中存儲的已知字符串長度。但是,由于strlen()是函數(shù),多多少少會有些慢,因為函數(shù)調(diào)用會經(jīng)過諸多步驟,如字母小寫化(譯注:指函數(shù)名小寫化,PHP不區(qū)分函數(shù)名大小寫)、哈希查找,會跟隨被調(diào)用的函數(shù)一起執(zhí)行。在某些情況下,你可以使用isset() 技巧加速執(zhí)行你的代碼。
24、當(dāng)執(zhí)行變量$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,并不適用于其他語言,所以請不要修改你的C或Java代碼并指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。后置遞增實際上會產(chǎn)生一個臨時變量,這個臨時變量隨后被遞增。而前置遞增直接在原值上遞增。這是最優(yōu)化處理的一種,正如Zend的PHP優(yōu)化器所作的那樣。牢記這個優(yōu)化處理不失為一個好主意,因為并不是所有的指令優(yōu)化器都會做同樣的優(yōu)化處理,并且存在大量沒有裝配指令優(yōu)化器的互聯(lián)網(wǎng)服務(wù)提供商(ISPs)和服務(wù)器。
25、并不是事必面向?qū)ο?OOP),面向?qū)ο笸_銷很大,每個方法和對象調(diào)用都會消耗很多內(nèi)存。
26、并非要用類實現(xiàn)所有的數(shù)據(jù)結(jié)構(gòu),數(shù)組也很有用。
27、盡量采用大量的PHP內(nèi)置函數(shù)。
28、如果在代碼中存在大量耗時的函數(shù),你可以考慮用C擴展的方式實現(xiàn)它們。
29、評估檢驗(profile)你的代碼。檢驗器會告訴你,代碼的哪些部分消耗了多少時間。Xdebug調(diào)試器包含了檢驗程序,評估檢驗總體上可以顯示出代碼的瓶頸。
30、mod_zip可作為Apache模塊,用來即時壓縮你的數(shù)據(jù),并可讓數(shù)據(jù)傳輸量降低80%。
31、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,盡量用file_get_contents,因為他的效率高得多!但是要注意file_get_contents在打開一個URL文件時候的PHP版本問題;
32、盡量的少進行文件操作,雖然PHP的文件操作效率也不低的;
33、優(yōu)化Select SQL語句,在可能的情況下盡量少的進行Insert、Update操作(在update上,我被惡批過);
34、循環(huán)內(nèi)部不要聲明變量,尤其是大變量:對象(這好像不只是PHP里面要注意的問題吧?);
35、多維數(shù)組盡量不要循環(huán)嵌套賦值;
36、在可以用PHP內(nèi)部字符串操作函數(shù)的情況下,不要用正則表達式;
37、foreach效率更高,盡量用foreach代替while和for循環(huán);
38、用單引號替代雙引號引用字符串;
39、“用i+=1代替i=i+1。符合c/c++的習(xí)慣,效率還高”;
40、對global變量,應(yīng)該用完就unset()掉;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22976.html
摘要:同時配置中的為,默認(rèn)為。表示監(jiān)控所有核心,表示每秒采集,表示采集次。則考慮使用或等加速器來減少解釋文件的耗時。程序性能監(jiān)控常用的方法就是開啟的性能監(jiān)控功能,將輸出結(jié)果通過軟件分析。輸出的文件名類似和,可以拿到平臺下用進行圖形化分析。 Nginx+PHP-FPM優(yōu)化技巧總結(jié) 這里是從網(wǎng)上找到的一片文章,認(rèn)真的實踐了一遍,有很多值得參考的地方可以學(xué)習(xí),由于之前的文章排版非常混亂,所以本人一...
摘要:同時配置中的為,默認(rèn)為。表示監(jiān)控所有核心,表示每秒采集,表示采集次。則考慮使用或等加速器來減少解釋文件的耗時。程序性能監(jiān)控常用的方法就是開啟的性能監(jiān)控功能,將輸出結(jié)果通過軟件分析。輸出的文件名類似和,可以拿到平臺下用進行圖形化分析。 Nginx+PHP-FPM優(yōu)化技巧總結(jié) 這里是從網(wǎng)上找到的一片文章,認(rèn)真的實踐了一遍,有很多值得參考的地方可以學(xué)習(xí),由于之前的文章排版非常混亂,所以本人一...
摘要:盡管事務(wù)是維護數(shù)據(jù)庫完整性的一個非常好的方法,但卻因為它的獨占性,有時會影響數(shù)據(jù)庫的性能,尤其是在很大的應(yīng)用系統(tǒng)中。由于在事務(wù)執(zhí)行的過程中,數(shù)據(jù)庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務(wù)結(jié)束。 1、雙引號和單引號的區(qū)別~雙引號解釋變量,單引號不解釋變量~雙引號解釋轉(zhuǎn)義字符,單引號不解釋轉(zhuǎn)義字符,但是解釋和~能使單引號字符盡量使用單引號,單引號的效率比雙引號要高(雙引號要先遍...
摘要:為了一探究竟,于是開啟了這次應(yīng)用性能調(diào)優(yōu)之旅。使用即時編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結(jié)。在經(jīng)歷了調(diào)優(yōu)過程踩的很多坑之后,我們最終完善并實施了初步的性能測試方案,通過真實的測試數(shù)據(jù)歸納出了 Laravel 開發(fā)過程中的一些實踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫的應(yīng)用程序響應(yīng)有點慢、20幾個并...
閱讀 3350·2021-11-04 16:10
閱讀 3846·2021-09-29 09:43
閱讀 2692·2021-09-24 10:24
閱讀 3338·2021-09-01 10:46
閱讀 2503·2019-08-30 15:54
閱讀 585·2019-08-30 13:19
閱讀 3232·2019-08-29 17:19
閱讀 1049·2019-08-29 16:40