php性能優(yōu)化

總體介紹:

一、規(guī)范說明

性能是網(wǎng)站運行是否良好的關鍵因素缚柏, 網(wǎng)站的性能與效率影響著公司的運營成本及長遠發(fā)展,編寫出高質高效的代碼是我們每個開發(fā)人員必備的素質,也是我們良好的職業(yè)素養(yǎng)碟贾。

二币喧、影響性能的因素
  • 商業(yè)需求
    1. 需求合理性
    2. 需求與系統(tǒng)的整合
    3. 需求所帶來的商業(yè)利益是否與需求開發(fā)的成本成正比
    4. 需求所帶來的風險
  • Web 服務器
    1. 并發(fā)處理能力
    2. 高負載的能力
    3. 負載均衡的能力
    4. 動態(tài)內容與靜態(tài)內容的處理能力
    5. Web 服務器部署
  • DataBase 服務器
    1. 并發(fā)訪問
    2. 數(shù)據(jù)庫服務器的部署
    3. 數(shù)據(jù)庫的 shema 架構與的表設計是否合理
    4. 數(shù)據(jù)檢索
  • 操作系統(tǒng)
  • 客戶端請求
  • 程序/語言
三、分析性能的指標
  • 程序的運行時間 microtime()
  • 程序的運行所消耗的內存memory_get_usage()
  • 單位時間內的并行處理
  • 磁盤 IO 的處理
四袱耽、優(yōu)化性能的目標
  • 快速粱锐、并發(fā)、資源消耗低(內存扛邑、磁盤 IO、CPU 負載)
五铐然、優(yōu)化性能的原則
  • 服務器配配置最優(yōu)化
  • 服務器部署合理化
  • 商業(yè)需求合理并與產(chǎn)出的商業(yè)價值成正比
  • 架構可用蔬崩、可維護恶座、可擴展
  • 程序的正確性、簡單性沥阳、邏輯的合理性跨琳。
  • 不斷的分析性能的的瓶頸
  • 不斷的重構已有的代碼
  • 優(yōu)化的優(yōu)先級:program->database->web sersver->os->client

代碼優(yōu)化:

1, 連接字符使用 , 代替 . ·echo ‘string1’,$a,’string2’,$b;·
2, 循環(huán)之前先取出最大值,而不是在循環(huán)里面取值

$max = count($array);
for ($i = 0; $i < $max; $i++) 
{
    echo $i;
}

3, 使用 static 靜態(tài)方法比普通方法快4倍桐罕,static表示的屬性只初始化一次 DataInterface::getUserIds($uid);
4, 在PHP中的執(zhí)行速率從快到慢為:echo(), print(), print_r()脉让,echo是PHP語句, print和print_r是函數(shù),語句沒有返回值,函數(shù)可以有返回值(即便沒有用)
5, 使用unset釋放給定的變量
6, includes 和requires 包含文件使用完整路徑
7, 使用strncasecmp, strpbrk 和 stripos 代替 regex
8, 使用switch代替if else語句
9, 抑制錯誤符@性能很低,報錯函數(shù)
10, 任何時間記住關閉不需要的數(shù)據(jù)庫連接
11, $row['id'] 比 $row[id] 性能快7倍
12, 增加一個全局變量比增加一個局部變量慢2倍
13, 使用單引號而不是雙引號引用字符
14, 使用HTML比PHP腳本快2-20倍
15, 使用PHP緩存可加速性能25%-100%
16, $++比++$i慢
17, 不要過度使用OOP,適度而止
18, 盡量使用PHP內置函數(shù)

變量

1, 變量長度小,注意變量大小是節(jié)約內存的最有效手段功炮,對于來自用戶表單溅潜、數(shù)據(jù)庫和文件緩存的數(shù)據(jù)都需要控制變量的大小。 因為cpu要處理的數(shù)據(jù)是來源于內存薪伏,名字越長查詢所需要的時間就越多
2, unset()函數(shù)注銷不需要的變量是一種良好的習慣滚澜,將一些不需要的變量立即注銷可提高內存的使用率。
3, 盡量不要復制變量嫁怀,否則就會帶來1倍的內存消耗设捐,即使復制變量也應該要立即注銷原有變量。
4, 變量類型,初始化變量請注意其變量類型塘淑,一個變量在執(zhí)行過程中最好只有一種類型狀態(tài)萝招。對于數(shù)組變量,請初始化聲明存捺,如下: $a = array();
5, 臨時變量,是處理業(yè)務邏輯的臨時存儲槐沼,這些都是需要消耗內存的。如果臨時變量使用結束請立即注銷召噩,特別是在一些過程式代碼的執(zhí)行流程中母赵,對于一些函數(shù),如果業(yè)務非常復雜具滴,同樣需要立即注銷臨時變量
6, 靜態(tài)變量,對于一些需要由復雜業(yè)務產(chǎn)生的變量凹嘲,如果在程序的執(zhí)行過程中多次產(chǎn)生并使用,可考慮使用靜態(tài)變量构韵,減少程序的cpu執(zhí)行次數(shù)
7, 變量的性能:局部變量>全局變量>類屬性>未定義的變量周蹭。

循環(huán)

1, 盡量減少循環(huán)的次數(shù)。
2, 盡量減少循環(huán)的潛逃的層次疲恢,不要超過三層凶朗。
3, 避免在循環(huán)內有過多的業(yè)務邏輯。
4, 不要循環(huán)包含文件
5, 不要循環(huán)執(zhí)行數(shù)據(jù)庫操作显拳。
6, 優(yōu)先使用foreach,它比for/while效率高
7, 不要把 count/strlen/sizeof 放到 for 循環(huán)的條件語句中
$count=count($array);for($i=0;$i<$count;$i++){};
8, for($i=$total;$i>0;$i--){};性能好于for($i=0;$i<$total;$i--){};
9, 保持循環(huán)體內的業(yè)務邏輯清晰

函數(shù)

1, 函數(shù)職責清晰棚愤,一個函數(shù)只干一件事,不要雜揉過多的業(yè)務邏輯
2, 函數(shù)代碼體不要超過20行,反之宛畦,考慮拆分瘸洛。
3, 優(yōu)先使用php內置函數(shù),內置函數(shù)的參數(shù)獲取次和,通過zend_parse_parameters方法來實現(xiàn)反肋,對于數(shù)組、字符串等參數(shù)踏施,zend實現(xiàn)的是淺拷貝石蔗,因此這個效率是很高的〕┬危可以這樣說养距,對于php內置函數(shù),其效率和相應c函數(shù)幾乎相同束亏,唯一多了一次轉發(fā)調用铃在。
4, 常量與函數(shù)同時能干一件事,優(yōu)先使用常量碍遍。

phpversion() < PHP_VERSION
get_class() < __CLASS__
is_null() < NULL ===

6, $_SERVER["REQUEST_TIME"] 替換 time();
7, 字符串替換strtr()->str_replace()->preg_replace()->epreg();
8, 發(fā)揮trim最大功效定铜,替換substr。$filepath=trim($filename,’/’).’/’;
9, isset/empty 雖然兩個函數(shù)功能有所差異怕敬,但在同樣的情況下推薦使用 empty()
10, isfile/file_exist 兩個函數(shù)的功能有所不同揣炕,file_exist既可判斷文件是否存在,也可以判斷目錄是否存在东跪,在同樣的情況下推薦使用is_file
11, php中的偽函數(shù)
isset empty unset eval
通過上面的介紹可以看出畸陡,偽函數(shù)由于被直接翻譯成指令來執(zhí)行,和普通函數(shù)相比少了一次函數(shù)調用所帶來的開銷虽填,因此性能會更好一些丁恭。
mt_rand平均速度比 libc 提供的 rand() 快四倍。

文件

1, 減少文件包含數(shù)斋日,減少磁盤 IO
2, 使用完整路徑牲览,或者容易轉換的相對路徑。避免在 include_path 查找
3, 文件的代碼行數(shù)不要超過 2000 行
4, Require_once/include_once 效率低于 require/include, 需要額外的去查看系統(tǒng)是否已經(jīng)調用過這個文件. 因為它們在一個 opcode 緩存下的調用非常慢
5, 程序執(zhí)行文件用 requie/require_once,緩存文件用include/include_once恶守。Include 效率好于 require
6, 優(yōu)化 spl 中的文件自動加載機制第献,可參靠 yii
7, 類庫文件加載,是否考慮類是否已經(jīng)實例化兔港,可考慮采用設計模式之單例模式
8, 文件讀寫的并發(fā)性

面向對象

1, 控制實例的創(chuàng)建的數(shù)量
2, 優(yōu)先使用常量庸毫、類常量
3, 優(yōu)先例用靜態(tài)變量,靜態(tài)屬性
4, 類的結構合理
5, 面象接口編程
6, 封裝變化點
7, 依賴于抽象衫樊,不依賴于細節(jié)
8, 優(yōu)先使用靜態(tài)成員
9, 類的接口清晰穩(wěn)定飒赃,類的職責單一,類與類的通信合理
10, 使用常量的好處 編譯時解析,沒有額外開銷 雜湊表更小盒揉,所以內部查找更快 類常量僅存在于特定「命名空間」, 所以雜湊名更短, 代碼更干凈晋被,使除錯更方便

運算

1, 用 i+=1 代替i=i+1。符合c/c++的習慣刚盈,效率還高
4, if/else與_&&,單條語句判斷請選擇&&的形式, &&的效率高于if/else挂脑,如下 :

if ($a == 1)
{
    $b = 2;
}可選擇為($a == 1) && $b = 2;

緩存

1, 使用php加速器藕漱,緩沖opcode
2, 例用memcache/nosql
3, 使用內存數(shù)據(jù)庫、
4, 使用文件緩存
5, 緩沖功能

其它

  • 資源優(yōu)化
    1, 少用@符號崭闲,嚴重影響性能
    2, 適時關閉遠程資源連接如數(shù)據(jù)庫肋联,ftp、socket等刁俭,適時的清理這些資源
  • 數(shù)據(jù)庫優(yōu)化
    1, 合理的商業(yè)需情
    2, 數(shù)據(jù)庫 schema 架構優(yōu)化
    3, 垂直與水平分庫分表
    4, 索引優(yōu)化橄仍,查詢優(yōu)化
    5, 第三方開源檢索工具(sphinx)
    6, 主從數(shù)據(jù)庫服務器的使用。
  • Web 服器優(yōu)化
  • 操作系統(tǒng)優(yōu)化
  • 前端優(yōu)化
    1牍戚、合理的 html 結構
    2侮繁、合理 html 與css 的同時,考慮 Css 設計合理如孝,減少 http 請求
    3宪哩、合理 html 與java script 的同時,考慮拆分是否合理第晰,減少 http 請求
    4锁孟、優(yōu)化 java script 代碼,讓用戶有良好的體驗
    5茁瘦、根據(jù) http 協(xié)議品抽,優(yōu)化高并發(fā)請求
  • 其他可以處理的
    1, 一個功能可以用內置函數(shù)完成,盡量使用它而不是自己編寫php函數(shù)甜熔。
    2, 如果某個功能對性能要求很高圆恤,可以考慮用擴展來實現(xiàn)。
    3, Php函數(shù)調用開銷較大纺非,因此不要過分封裝哑了。有些功能,如果需要調用的次數(shù)很多本身又只用1烧颖、2行代碼就行實現(xiàn)的弱左,建議就不要封裝調用了。
    4, 不要過分迷戀各種設計模式炕淮,如上一條描述拆火,過分的封裝會帶來性能的下降。需要考慮兩者的權衡。Php有自己的特點们镜,切不可東施效顰币叹,過分效仿java的模式。
    5, 函數(shù)不宜嵌套過深模狭,遞歸使用要謹慎颈抚。
    6, 偽函數(shù)性能很高,同等功能實現(xiàn)下優(yōu)先考慮嚼鹉。比如用isset代替array_key_exists
    7, 函數(shù)返回引用沒有太大意義贩汉,也起不到實際作用,建議不予考慮锚赤。
    8, 類成員方法效率不比普通函數(shù)低匹舞,因此不用擔心性能損耗。建議多考慮靜態(tài)方法线脚,可讀性及安全性都更好赐稽。
    9, 如不是特殊需要,參數(shù)傳遞都建議使用傳值而不是傳引用浑侥。當然姊舵,如果參數(shù)是很大的數(shù)組且需要修改時可以考慮引用傳遞。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锭吨,一起剝皮案震驚了整個濱河市蠢莺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌零如,老刑警劉巖躏将,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異考蕾,居然都是意外死亡祸憋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門肖卧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚯窥,“玉大人,你說我怎么就攤上這事塞帐±乖” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵葵姥,是天一觀的道長荷鼠。 經(jīng)常有香客問我,道長榔幸,這世上最難降的妖魔是什么允乐? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任矮嫉,我火速辦了婚禮,結果婚禮上牍疏,老公的妹妹穿的比我還像新娘蠢笋。我一直安慰自己,他們只是感情好鳞陨,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布昨寞。 她就那樣靜靜地躺著,像睡著了一般炊邦。 火紅的嫁衣襯著肌膚如雪编矾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天馁害,我揣著相機與錄音,去河邊找鬼蹂匹。 笑死碘菜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的限寞。 我是一名探鬼主播忍啸,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼履植!你這毒婦竟也來了计雌?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤玫霎,失蹤者是張志新(化名)和其女友劉穎凿滤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庶近,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡翁脆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鼻种。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片反番。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叉钥,靈堂內的尸體忽然破棺而出罢缸,到底是詐尸還是另有隱情,我是刑警寧澤投队,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布枫疆,位于F島的核電站,受9級特大地震影響蛾洛,放射性物質發(fā)生泄漏养铸。R本人自食惡果不足惜雁芙,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钞螟。 院中可真熱鬧兔甘,春花似錦、人聲如沸鳞滨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拯啦。三九已至澡匪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褒链,已是汗流浹背唁情。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甫匹,地道東北人甸鸟。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像兵迅,于是被迫代替她去往敵國和親抢韭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容

  • 1恍箭、用單引號代替雙引號來包含字符串刻恭,這樣做會更快一些。因為PHP會在雙引號包圍的字符串中搜尋變量扯夭,單引號則不會鳍贾,注...
    紅魚綠魚與驢閱讀 1,072評論 0 3
  • 1、如果能將類的方法定義成static勉抓,就盡量定義成static贾漏,它的速度會提升將近4倍。 2藕筋、$row['id'...
    紅魚綠魚與驢閱讀 183評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,312評論 25 707
  • 1 PHP語言級性能優(yōu)化:少些代碼纵散,多用PHP自身能力;(多用PHP內置變量隐圾,常量伍掀,函數(shù)) PHP內置函數(shù)的性能不...
    Hank桁閱讀 165評論 0 0
  • 因公司項目要求 最近在寫H5項目 遇到了關于分頁加載list列表的問題 網(wǎng)上差了一些資料 經(jīng)過自己整理 完美的實現(xiàn)...
    哈酒拎壺沖閱讀 540評論 0 0