江湖恩仇錄之PHP程序CPU高佔用優化經歷分享

故事原由

本故事根據真實故事書寫,若有雷同絕非巧合。在開發過程當中不免反覆修改程序,面對忽然起來的問題不免一籌莫展,有些人選擇自我處理問題,也有人選擇交流區域諮詢,或許恰巧有人有相似的問題,恰好能夠解決你的問題,可是若是你的問題剛好有些獨特,最後仍是須要本身谷歌百度,大海撈針似的搜尋。
一套幾年前的程序,如今急需大範圍使用起來,優化了一些細節,因爲業務的轉型,全線使用php快速解決方案,因而乎就沒有測試其餘問題匆忙上線了。php

初入江湖下山歷練

去年上線,上線確定難以免不少細節問題,優化優化,最大的優化就是佈局模式增長,常見的企業網站佈局方式不免那麼幾種,因而在總結常見狀況的基礎下開始了佈局設計。大體分析爲以下草圖。
layout
首頁佈局模式比起以前的要多一些,所有模塊容器是自適應的,無內容的狀況下自動收縮。left與right默認狀況下保留一種,按鈕提示網站編輯人員自動激活。html

無統一心法幾乎走火入魔

開發過程當中必需要有一套統一的規範,但經常有這樣的狀況,第一規範運行後有一批產出的時候,優化細節後又上了第二規範,初入江湖的時候已是正式大範圍使用的第三次規範了,也就是說以前有異議。這個只是說在使用過程當中若是碰見以前版本的,從新按照新的規範優化上線,對於沒有使用到的暫時就保持原型。mysql

平靜中暗藏殺機

漸漸的佈局的問題趨於平靜,伴隨着這種平靜迎來的一個新的難題,服務器CPU飆高,卡死。
這個是我今天主要分享的故事,公司因爲自身條件的問題,一直使用的windows+iis+mysql+php(asp),在win上使用iis運行php,使用過這樣生產環境的應該知道上面的各類問題,可是實際問題仍是實際問題,改變不了只能按照這種環境來作適應。其餘問題暫且不描述了,說來就話長了。
除了服務器的緣由,確定的仍是程序有問題了。linux

潛心修煉 問題分析

  1. 首頁佈局複雜化加載引發?
    訪問模式與編輯模式同時操做首頁,首頁也是動態讀取,解決方案就是靜態化首頁,服務器環境設置文檔類型優先級index.html高於index.php,這樣一來就須要第一次自動生成,後續主動生成。這個過程也伴隨着不少問題,編輯時本身遺忘了生成,產生出的問題就是我添加了資料爲什麼界面沒有任何變化?這個只是一個習慣問題,漸漸的就行了,可是問題仍是存在,只是感受好了一些許。
  2. 首頁佈局程序優化?
    大部分時間是在操做資料添加,首頁佈局拖動,首頁佈局拖動保存的時候頁面會刷新一次,加載一次頁面自己佔用很高的CPU,開發環境下連續屢次刷新的後果就是卡死,還不用說服務器環境下。因而想到的是把佈局拖動完成後的那一次刷新給取消掉,經過ajax的方式插入內容,可是實際的開發過程當中因爲程序自己的問題,修改了一些程序,眼看着就能成功的時候碰見了一些小問題,數據不能與結構關聯起來,正準備深刻研究怎麼解決的時候,找尋了一些程序分析優化工具,前面的工做就放棄了,開始給程序作一個總體的診斷。
  3. 工具的選擇
    以前尚未這麼細緻的優化過程序,徹底不知道如何開始下手。在 @luofei614 的建議下推薦我試試xdebug,xhprof,使用就是oneApm,其中oneApm簡單不少,搜索了一下發現是藍海訊通的項目,這裏好像有一個認識的人 @互聯網fans ,他們的態度的確不錯,只是我只是抱着試試的心態註冊使用了,非常挺不錯的,可是隻有linux的,在win上的方案沒有,下了key下來也沒有使用,次日客服居然經過我留下的電話聯繫了我,諮詢相關狀況,還好沒有留下企業名稱要不就暴露了。態度不錯,可是確定是有緣由的…
    無奈下一個工具,以前其實就瞭解過這些工具,可是一直沒有落實過使用方法,此次是被逼無奈的。嘗試了使用xedebug,安裝過程什麼都仍是比較愉快,可是就是擴展始終加載不起。在官網文檔上找到了問題的緣由:git

    Xdebug does not work together with the Zend Optimizer or any other extension that deals with PHP's internals (DBG, APD, ioncube etc). This is due to compatibility problems with those modules.github

    因爲zend的緣由暫時就放棄了xdebug,轉爲嘗試xhprof,這時又發現了一個新的問題,在windows上xhprof的php的版本是5.3+,生產環境的php的版本是5.2.17,按理說應該能夠編譯一個適合5.2的xhprof,不會這個也就無奈了。本地開發中我切換到了5.3,愉快的運行了,替換掉了核心加密文件,分析過程也就即將開始了。
  4. 正式開始檢查優化工做
    一個好的工具每每是解決問題的關鍵方案,知道根本緣由,而後對症下藥。安裝好了xhprof,檢測了一下程序如今的運行狀況
    問題未解決
    問題未解決
    從圖中能夠看出大量文件操做致使CPU佔用極高,找到問題就是接下來優化問題,程序中有使用一個mysql_fetch_object(),表面看是沒有什麼問題的,php官網文檔,中描述的是接收一個資源結果集做爲參數。可是程序中這裏使用了多個參數,搜索了一下找不到答案,有幾個簡單的描述,可是仍是不能理解,還但願熟悉的指教一下,謝謝。我暫時直接取消後兩個參數,相應的首頁判斷加載的時候調用了一個方法暫時也就屏蔽了,內容無異,相反各方面數據都明顯提高。
    問題解決很大一部分
    問題解決很大一部分ajax

涉世總結 祕籍書寫

xhprof 性能分析器的使用

1.安裝擴展,選擇適合本身版本的xhprof,phpinfo查看適合安裝成功
2.簡單的調試,數據模式+可視化模式sql

/**
 * xhprof start
 * XHPROF_FLAGS_NO_BUILTINS (integer) 使得跳過全部內置(內部)函數。
 * XHPROF_FLAGS_CPU (integer) 使輸出的性能數據中添加 CPU 數據。
 * XHPROF_FLAGS_MEMORY (integer) 使輸出的性能數據中添加內存數據。 
 */
xhprof_enable(XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_CPU);
function useXhprof() {
    $str;
    $i = 1000;
    while (($i--)>=0) {
        $str .= $i;
    }
    return $str;
}
useXhprof();
$xhprof_data = xhprof_disable();
print_r($xhprof_data);
/**
 * 截取部分參數含義表示
 * [main()==>useXhprof] => Array ( 
 *      [ct] => 1       useXhprof函數的調用次數
 *      [wt] => 2064        消耗的時間,單位爲微秒
 *      [cpu] => 0      cpu時間
 *      [mu] => 3744        內存使用狀況,單位byte
 *      [pmu] => 728        峯值內存使用狀況
 * )
 */
/**
 * 可視化 這裏按照本身的狀況設置好參數 clone地址:https://github.com/phacility/xhprof 
 */
$XHPROF_ROOT = realpath(dirname(__FILE__) .'/xhprof');
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo "<a href='/xhprof/xhprof_html/index.php?run=$run_id&source=xhprof_foo'>look</a>";

可視化測試圖例

相關文章
相關標籤/搜索