wget http://pecl.php.net/get/xhprof-0.9.4.tgz tar zxf xhprof-0.9.4.tgz cd xhprof-0.9.4/extension/ sudo phpize ./configure sudo make sudo make install cd ../
設定php.ini
[xhprof] extension=xhprof.so xhprof.output_dir=/tmp
註:xhprof已經很久沒有更新過了,截至目前還不支援php7,php7可以使用https://github. com/phacility/...。
需要把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 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裡列出了:
funciton name :函數名稱
calls: 呼叫次數
yum install -y libpng yum install -y graphviz效果:
/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裡展示出來。主要知識點:
解決laravel-admin中select在form編輯時不能自動選取目前的值的問題
以上是使用XHProf分析PHP性能瓶頸的方法一的詳細內容。更多資訊請關注PHP中文網其他相關文章!