環境
macOs Sierra
php 7.0.8
MAMP Pro 集成環境
背景
最近有一個需要在微信朋友圈上線的 h5,本人做了一個抽獎的接口,也沒多想,直接上 php ci(CodeIgniter
)框架。
按照騰訊方的要求,需要 ab 測試,在總請求數 15000,並發 500 下平均響應時間小於 200ms。
誰知道等開發完畢,ab 跑完,響應時間直飈近 400ms。
所以接下來借助 php 強大的 xDebug
擴展和 webgrind
來查看代碼調用耗時情況。
1、添加 php 的 xDebug 擴展
因為 MAMP Pro 自帶 xDebug 擴展,所以直接開啟就好:
2、php.ini 配置中開啟 Profiler(性能跟蹤器)
Profiler
工作方式類似於函數追蹤,是在腳本程序運行時自動將性能記錄文件保存下來。
[php.ini]
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 1
3、下載 webgrind
因為 xDebug 的 Profiler 生成的性能記錄文件的格式,不是給人看的:
所以需要下載圖形界面的分析工具,Linux KDE 可以用 KChaceGrind
,windows 下可以用 winChaceGrind
,Mac 上沒有發現合適的桌面端軟件,所以用 Web 版的 webgrind 是最好的選擇。
Github 地址:https://github.com/jokkedk/webgrind
下載后直接放在本地服務器根目錄直接訪問就行:
4、使用方法
把需要分析的 url 后面接上 ?XDEBUG_PROFILE
,例如:
http://localhost/XXX/index.php/PriceApply/getPrice?XDEBUG_PROFILE
然后刷新 webgrind 網頁,新的數據會出現:
下面介紹下 webgrind 的一些參數含義:
第一個選項:webgrind 把所有被調用函數/方法首先做一個排序,由高到低顯示。然后取出前 N 個,使他們耗時比率之和在 90-100% 之間。
要注意的是,最好不要選擇100%,這樣將會顯示所有被調用的函數/方法,如果是一個代碼復雜的頁面,那么webgrind偶爾會被卡死。並且通常我們只要關注耗時前幾 > 名的函數即可。
第二個選項:選擇 profile 文件。默認是分析最新一次的 xdebug 記錄。如果之前設置好路徑和記錄機制那么我們就會發現下拉列表里有很多選項。
第三個選項:顯示百分比/毫秒/微秒。
彩色進度條:藍代表 php 內置函數,灰代表 require/include,綠代表類方法,橙黃代表過程函數 (用戶自定義函數)
invocation count - 表示整個 php 頁面從載入到執行完畢呈現,各種函數被調用的總次數
total self cost - 表示函數自身消耗
total inclusive cost - 表示此函數從開始到執行完畢所用消耗 ,包括自身消耗和調用其他函數消耗
點擊一個父函數名后出現展開:
Calls - 此函數中調用並執行的所有函數/方法名、次數及耗時
Total Call Cost - 被此父函數調用時,執行的總耗時
Count - 被此父函數調用時,執行的次數
5、分析數據
如上圖,最耗時的並不是我認為的抽獎模塊,而是 ci 框架本身 + 數據庫
讓我再進一步瞧瞧:
如上圖,在 load_class
項目里,最耗時的涉及 ci 框架重要模塊的加載,包括URL、Hooks、Config、Router、Output模塊,這些都是 ci 框架易用性的保障,除了Hooks 可以在 config 文件里禁用,絕大多數應該不能關閉。
再來看 DB
項,最耗時的是數據庫的初始化
最后一項,是 ci 的系統核心層
,最耗時的是 model 的構造過程,仍是初始化
結論
借用《主流 PHP 框架性能評測》(https://gold.xitu.io/entry/578ef4d6d342d30058e17d98) 文中的數據分析圖(柱狀圖越高性能越好)
框架有利有弊,利是方便開發,易用穩定,弊端可能就是不管你的實際需求,初始化加載很多用不到的功能。
所以:
在涉及微小型的接口開發,建議采用原生 php 。
在涉及復雜型接口時,采用框架的同時,適當開啟 php 緩存,比如 APC 和 OPcache,都可以讓性能得到一些提升,彌補使用框架的不足。