安裝xhprof擴充
wget http://pecl.php.net/get/xhprof-0.9.4.tgztar zxf xhprof-0.9.4.tgzcd xhprof-0.9.4/extension/sudo phpize./configuresudo makesudo make installcd ../
配置php.ini
[xhprof]extension=xhprof.soxhprof.output_dir=/tmp
註:xhprof已經很久沒有更新過了,截至目前還不支援php7,php7可以使用 https://github.com/phacility/...。
配置xhprof環境
需要把xhprof壓縮包裡的兩個目錄複寫到指定目錄(假設定義到 /work/xhprof/
):
mkdir /work/xhprof/cp -a xhprof_html/ /work/xhprof/cp -a xhprof_lib/ /work/xhprof/
然後在項目架構的入口檔案添加:
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);register_shutdown_function(function() { $xhprof_data = xhprof_disable(); if (function_exists('fastcgi_finish_request')){ fastcgi_finish_request(); } include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php"; include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');});
代碼解析:
$xhprof_data
中記錄了程式運行過程中所有的函數調用時間及CPU記憶體消耗,具體記錄哪些指標可以通過xhprof_enable的參數控制,目前支援的參數有:
HPROF_FLAGS_NO_BUILTINS
跳過所有內建(內部)函數。
XHPROF_FLAGS_CPU
輸出的效能資料中添加 CPU 資料。
XHPROF_FLAGS_MEMORY
輸出的效能資料中添加記憶體資料。
之後的處理已經與xhprof擴充無關,大致是編寫一個儲存類XHProfRuns_Default
,將$xhprof_data
序列化並儲存到某個目錄,可以通過XHProfRuns_Default(__DIR__)
將結果輸出到目前的目錄,如果不指定則會讀取php.ini
設定檔中的xhprof.output_dir
,仍然沒有指定則會輸出到/tmp
。
xhprof_enable
和xhprof_disable
是成對出現的,一個是代碼運行最前面,一個是最後面。中間是要分析的代碼。
經過上面的配置後,我們後續請求項目的介面,xhprof就會分析請求過程中的CPU、記憶體、耗時等內容。日誌儲存在xhprof.output_dir
目錄。
配置web
配置好了,怎麼查看日誌呢?我們可以搭建一個簡單的web server:
xhprof.test.com.conf
server { listen 80; server_name xhprof.test.com; root /work/xhprof/xhprof_html; index index.html index.php; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }}
然後配置虛擬機器主機xhprof.test.com。重啟nginx,開啟 xhprof.test.com就可以看到效果了:
預設的UI裡列出了:
在web中還可以看到 [View Full Callgraph] 連結,點擊後可以繪製出一張可視化的效能分析圖,如果點擊後報錯的話,可能是缺少依賴graphviz。graphviz是一個繪製圖形的工具,可以更為直觀的讓你查看效能的瓶頸。如果需要可以安裝:
yum install -y libpngyum install -y graphviz
效果:
非侵入式引入xhprof
前面我們是通過在項目入口檔案添加代碼實現了分析的功能。更優雅的方式是建立一個額外的檔案 xhprof.inc.php,儲存在/work/xhprof/
目錄下:
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);register_shutdown_function(function() { $xhprof_data = xhprof_disable(); if (function_exists('fastcgi_finish_request')){ fastcgi_finish_request(); } include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php"; include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');});
利用PHP的自動載入功能,在執行代碼前注入此檔案,編輯php.ini:
auto_prepend_file = /work/xhprof/xhprof.inc.php
然後重啟PHP服務。這樣所有使用該php環境的都會生效。
或者寫到指定項目的nginx配置裡也行:
jifen.cc.conf
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_VALUE "auto_prepend_file=/work/xhprof/xhprof.inc.php"; include fastcgi_params; }
然後重啟nginx服務。這樣僅該項目生效。
通過 auto_prepend_file 和 auto_append_file包含的檔案在此模式下會被解析,但有些限制,例如函數必須在被調用之前定義。
修改採樣頻率
預設情況下,xhprof每次都會運行,線上環境如果這麼設定,會對效能有影響。
xhprof.inc.php
<?php$profiling = !(mt_rand()%9); if($profiling) xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);register_shutdown_function(function() use($profiling) { if($profiling){ $xhprof_data = xhprof_disable(); if (function_exists('fastcgi_finish_request')){ fastcgi_finish_request(); } include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php"; include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $xhprof_runs->save_run($xhprof_data, 'xhprof'); }});
總結
本篇文章裡,我們介紹了如何基於xhprof擴充來分析PHP效能,並記錄到日誌裡,最後使用xhprof擴充內建的UI在web裡展示出來。主要知識點:
安裝xhprof擴充
在應用裡注入xhprof
基於nginx展示分析結果
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!