本篇文章給大家帶來的內容是關於php中的擴充Xhprof如何分析項目的效能,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。
一、背景
項目即將上線,想通過一些工具來分析代碼的穩定性和效率,想起在上個團隊時使用過的xhprof擴充;因為換了新電腦,所以需要重新編譯此擴充,現將安裝與實際排查過程完整記錄下來,方便自己回顧和協助更多的讀者。
二、操作步驟
安裝擴充
配置擴充
測試分析
三、安裝
xhprof擴充PHP並不內建,需要筆者去單獨安裝它,安裝之後才能使用,筆者這裡採用源碼安裝方式,安裝過程如下
3.1 下載源碼
xhprof在PHP的PECL官方上面已經比較老了,筆者的PHP版本為PHP7.1因此,需要在GitHub上下載xhprof上比較新的源碼,參考命令如下
git clone https://github.com/longxinH/xhprof
3.2 檢測環境
進入編譯的檔案夾,參考命令
cd xhprof/extension/
現在筆者需要編譯一下源碼,在編譯之前可以使用phpze來探測PHP的環境,參考命令如下:
phpize
返回結果如下
Configuring for:PHP Api Version: 20160303Zend Module Api No: 20160303Zend Extension Api No: 320160303
3.3 編譯安裝
產生 Makefile,為下一步的編譯做準備
./configure
返回結果如下
creating libtoolappending configuration tag "CXX" to libtoolconfigure: creating ./config.statusconfig.status: creating config.hconfig.status: config.h is unchanged
開始編譯,並進行安裝
make && make install
返回結果如下
Build complete.Don't forget to run 'make test'.Installing shared extensions: /usr/local/Cellar/php@7.1/7.1.19/pecl/20160303/
從返回資訊中可以看到已經安裝完成,並顯示了擴充檔案存放的位置
四、配置
在編譯安裝源碼之後,筆者還需要對PHP的設定檔夾以及xhprof的進行一些簡單的配置,操作過程如下所示
4.1 找出設定檔位置
要修改PHP的配置首先需要知道設定檔在什麼位置,這裡可以通過PHP的命令來查看設定檔存放位置,參考命令如下:
php --ini
執行命令後,返回結果如下
Configuration File (php.ini) Path: /usr/local/etc/php/7.1Loaded Configuration File: /usr/local/etc/php/7.1/php.iniScan for additional .ini files in: /usr/local/etc/php/7.1/conf.dAdditional .ini files parsed: /usr/local/etc/php/7.1/conf.d/ext-opcache.ini
在返回結果當中,可以看到多個設定檔的路徑,筆者所需要的是第二個檔案php.ini
查看擴充目錄存放位置,參考命令如下
cat /usr/local/etc/php/7.1/php.ini | grep extension_dir
返回結果如下
extension_dir = "/usr/local/lib/php/pecl/20160303"; extension_dir = "ext"; Be sure to appropriately set the extension_dir directive.;sqlite3.extension_dir =
4.2 修改配置
從返回的結果當中,可以看到擴充的存放目錄位置如下
/usr/local/lib/php/pecl/20160303
現在需要將剛才編譯好的xhprof擴充複製到該目錄當中,參考命令如下
cp /usr/local/Cellar/php@7.1/7.1.19/pecl/20160303/xhprof.so /usr/local/Cellar/php@7.1/7.1.19/pecl/20160303/
通過vim編輯器編輯設定檔,參考命令如下
vim /usr/local/etc/php/7.1/php.ini
在設定檔尾部增加xhprof的配置,以及自訂一個用來儲存xhprof產生的源檔案參考配置如下
[xhprof]extension=xhprof.soxhprof.output_dir=/data/www/xhprof/save_output_dir
4.3 重啟生效
儲存好之後,筆者重啟php-fpm讓其配置生效,重啟命令可以通過brew命令來查看,參考命令如下:
brew info php@7.1
在命令執行後,返回的資訊中可以看到如下資訊
To have launchd start php@7.1 now and restart at login: brew services start php@7.1Or, if you don't want/need a background service you can just run: php-fpm
因此筆者構造的重啟PHP-FPM命令如下:
brew services restart php@7.1
重啟完成後,返回結果如下
Stopping `php@7.1`... (might take a while)==> Successfully stopped `php@7.1` (label: homebrew.mxcl.php@7.1)==> Successfully started `php@7.1` (label: homebrew.mxcl.php@7.1)
4.4 驗證安裝
現在驗證xhprof擴充是否已經安裝完成,參考命令如下
php -m | grep xhprof
命令執行後,安裝擴充成功的返回結果將會顯示xhprof,如所示
五、測試
經過上面的操作筆者已經成功的安裝與配置,現在需要用PHP代碼來進行驗證xhprof的分析效果
5.1 建立虛擬機器主機
首先建立一個虛擬機器主機,讓使用者可以通過瀏覽器訪問所訪問,建立虛擬機器主機需要有一個根目錄,並編輯nginx設定檔,具體操作如下:
5.1.1 建立項目目錄
建立項目根目錄,參考命令如下
mkdir -p /Users/song/mycode/work/test
建立成功之後,筆者需要將之前git拉下來的部分代碼複製到項目根目錄當中,參考命令如下
cp -r xhprof/xhprof_html /Users/song/mycode/work/test/cp -r xhprof/xhprof_lib /Users/song/mycode/work/test/
5.1.2 編輯設定檔
添加設定檔,參考命令
/usr/local/etc/nginx/nginx.conf
添加設定檔如下
server { listen 80; server_name test.localhost; root /Users/song/mycode/work/test; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php?$query_string; } 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; } }
在/etc/hosts檔案中增加入一行解析記錄,記錄內容如下:
127.0.0.1 test.localhost
5.2 建立測試代碼
在git倉庫的examples檔案夾下,已經有了一份demo代碼,不過這份代碼的注釋都是英文,而且排版方式也不易筆者自己理解,因此筆者重新編輯了此檔案,參考步驟如下命令
使用vim建立一個PHP檔案
vim /Users/song/mycode/work/test/test.php
在檔案中加入以下代碼
<?php//載入所需檔案include_once "./xhprof_lib/utils/xhprof_lib.php";include_once "./xhprof_lib/utils/xhprof_runs.php";//隨意定義一個函數function test($max){ for ($idx = 0; $idx < $max; $idx++) { echo ''; }}//定義測試方法function a(){ test(rand(1000,5000));}//開始分析xhprof_enable();//需要分析的函數a();//結束分析$xhprof_data = xhprof_disable();//執行個體化xhprof類$xhprof_runs = new XHProfRuns_Default();//擷取當前當前頁面分析結果$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");echo "\nhttp://test.localhost/xhprof/xhprof_html/index.php?run=$run_id&source=xhprof_foo\n";
儲存代碼之後,通過瀏覽器訪問對應的URL地址,URL地址如下所示
http://test.localhost/xhprof/test.php
5.3 結果分析
運行後結果,如
在頁面中可以看到一個URL地址,複製並開啟此URL地址之後,便能看到此代碼的分析結果,如所示
在頁面中有一個列表,展示了每一個方法所消耗的時間,如果覺得列表的方式表示不夠清晰,點擊頁面中的 View Full Callgraph 連結可以直接產生一個圖片,如所示
在圖中很清晰的可以看到執行時間都消耗在test方法上,因此筆者可以針對這個方法進行針對性的最佳化。