本故事根據真實故事書寫,若有雷同絕非巧合。在開發過程當中不免反覆修改程序,面對忽然起來的問題不免一籌莫展,有些人選擇自我處理問題,也有人選擇交流區域諮詢,或許恰巧有人有相似的問題,恰好能夠解決你的問題,可是若是你的問題剛好有些獨特,最後仍是須要本身谷歌百度,大海撈針似的搜尋。
一套幾年前的程序,如今急需大範圍使用起來,優化了一些細節,因爲業務的轉型,全線使用php快速解決方案,因而乎就沒有測試其餘問題匆忙上線了。php
去年上線,上線確定難以免不少細節問題,優化優化,最大的優化就是佈局模式增長,常見的企業網站佈局方式不免那麼幾種,因而在總結常見狀況的基礎下開始了佈局設計。大體分析爲以下草圖。
首頁佈局模式比起以前的要多一些,所有模塊容器是自適應的,無內容的狀況下自動收縮。left與right默認狀況下保留一種,按鈕提示網站編輯人員自動激活。html
開發過程當中必需要有一套統一的規範,但經常有這樣的狀況,第一規範運行後有一批產出的時候,優化細節後又上了第二規範,初入江湖的時候已是正式大範圍使用的第三次規範了,也就是說以前有異議。這個只是說在使用過程當中若是碰見以前版本的,從新按照新的規範優化上線,對於沒有使用到的暫時就保持原型。mysql
漸漸的佈局的問題趨於平靜,伴隨着這種平靜迎來的一個新的難題,服務器CPU飆高,卡死。
這個是我今天主要分享的故事,公司因爲自身條件的問題,一直使用的windows+iis+mysql+php(asp),在win上使用iis運行php,使用過這樣生產環境的應該知道上面的各類問題,可是實際問題仍是實際問題,改變不了只能按照這種環境來作適應。其餘問題暫且不描述了,說來就話長了。
除了服務器的緣由,確定的仍是程序有問題了。linux
工具的選擇
以前尚未這麼細緻的優化過程序,徹底不知道如何開始下手。在 @luofei614 的建議下推薦我試試xdebug,xhprof,使用就是oneApm,其中oneApm簡單不少,搜索了一下發現是藍海訊通的項目,這裏好像有一個認識的人 @互聯網fans ,他們的態度的確不錯,只是我只是抱着試試的心態註冊使用了,非常挺不錯的,可是隻有linux的,在win上的方案沒有,下了key下來也沒有使用,次日客服居然經過我留下的電話聯繫了我,諮詢相關狀況,還好沒有留下企業名稱要不就暴露了。態度不錯,可是確定是有緣由的…
無奈下一個工具,以前其實就瞭解過這些工具,可是一直沒有落實過使用方法,此次是被逼無奈的。嘗試了使用xedebug,安裝過程什麼都仍是比較愉快,可是就是擴展始終加載不起。在官網文檔上找到了問題的緣由:git
因爲zend的緣由暫時就放棄了xdebug,轉爲嘗試xhprof,這時又發現了一個新的問題,在windows上xhprof的php的版本是5.3+,生產環境的php的版本是5.2.17,按理說應該能夠編譯一個適合5.2的xhprof,不會這個也就無奈了。本地開發中我切換到了5.3,愉快的運行了,替換掉了核心加密文件,分析過程也就即將開始了。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
正式開始檢查優化工做
一個好的工具每每是解決問題的關鍵方案,知道根本緣由,而後對症下藥。安裝好了xhprof,檢測了一下程序如今的運行狀況
從圖中能夠看出大量文件操做致使CPU佔用極高,找到問題就是接下來優化問題,程序中有使用一個mysql_fetch_object(),表面看是沒有什麼問題的,php官網文檔,中描述的是接收一個資源結果集做爲參數。可是程序中這裏使用了多個參數,搜索了一下找不到答案,有幾個簡單的描述,可是仍是不能理解,還但願熟悉的指教一下,謝謝。我暫時直接取消後兩個參數,相應的首頁判斷加載的時候調用了一個方法暫時也就屏蔽了,內容無異,相反各方面數據都明顯提高。
ajax
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>";