Xhprof是facebook開源出來的一個php輕量級的性能分析工具,跟Xdebug類似,但性能開銷更低,還可以用在生產環境中,也可以由程序開關來控制是否進行profile。
對于還在使用php5的朋友們,可以安裝pecl的xhprof擴展
`http:``//pecl.php.net/package/xhprof`
但是因為長時間不更新,針對php7已無法正常安裝,可以使用下的地址
`https:``//github.com/longxinH/xhprof/releases`
一、安裝xhprof
下載xhprof源碼
`wget https:``//github.com/longxinH/xhprof/archive/v2.1.0.tar.gz`
解壓源碼包
`tar xf v2.1.0.tar.gz`
進入目錄
`cd xhprof-2.1.0/extension`
運行phpize,請自行修改你們的phpize路徑
`/data/nmp/php7/bin/phpize`
運行configure,請自行修改你們的php-config路徑
`./configure --with-php-config=/data/nmp/php7/bin/php-config`
編譯安裝
`make && make install
修改php.ini配置,如果extension_dir配置了就不用再配置了,如果沒配置,則把該目錄指向,擴展編譯安裝后顯示的路徑。
`extension_dir =?``"/data/nmp/php7/lib/php/extensions/no-debug-zts-20170718"`
`[xhprof]`
`extension = xhprof.so`
`xhprof.output_dir = /tmp/xhprof`
二、配置xhprof
我們把擴展目錄下的xhprof_html和xhprof_lib復制出來,單獨存放到一個目錄中。
`cp -a xhprof_html /data/wwwroot/xhprof`
`cp -a xhprof_lib /data/wwwroot/xhprof`
針對要分析的項目,可以把如下代碼添加到入口文件中:
```
`//開啟性能分析`
`xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);`
`//php中止時運行的函數`
`register_shutdown_function(``function`?`() {`
`//停止性能分析`
`$xhprof_data`?`= xhprof_disable();`
`if`?`(function_exists(``'fastcgi_finish_request'``)) {`
`fastcgi_finish_request();`
`}`
`//引入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();`
`//導出性能分析數據,默認xhprof.output_dir指定的目錄`
`$run_id`?`=?``$xhprof_runs``->save_run(``$xhprof_data``,?``'xhprof'``);`
`});`
```
數據默認會導出到xhprof.output_dir指定目錄,所以需創建該目錄,并給予相關權限
`mkdir`?`/tmp/xhprof`
`chmod`?`-R 777 /tmp/xhprof`
這里我們寫一個簡單程序進行一下演示
```
`<?php`
`error_reporting``(E_ALL);`
`ini_set``(``'display_errors'``,?``'on'``);`
`//開啟性能分析`
`xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);`
`//php中止時運行的函數`
`register_shutdown_function(``function`?`() {`
`//停止性能分析`
`$xhprof_data`?`= xhprof_disable();`
`if`?`(function_exists(``'fastcgi_finish_request'``)) {`
`fastcgi_finish_request();`
`}`
`//引入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();`
`//導出性能分析數據,默認xhprof.output_dir指定的目錄`
`$run_id`?`=?``$xhprof_runs``->save_run(``$xhprof_data``,?``'xhprof'``);`
`});`
`function`?`a()`
`{`
`echo`?`'aaa'``;`
`sleep(1);`
`b();`
`}`
`function`?`b()`
`{`
`echo`?`'bbb'``;`
`sleep(3);`
`c();`
`}`
`function`?`c()`
`{`
`echo`?`'ccc'``;`
`sleep(5);`
`}`
`a();`
```
三、配置虛擬主機,用來查看分析日志
```
`server {`
`listen?????? 80;`
`server_name? xhprof.xxx.com;`
`charset utf-8;`
`root?? /data/wwwroot/xhprof/xhprof_html;`
`index? index.html index.htm 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.xxx.com來查看分析日志了。

如果點擊 [View Full Callgraph] 無法查看,則需裝如下工具:
`yum install -y libpng`
`yum install -y graphviz`
如果上面安裝完后,還是無法顯示,并報如下錯誤:
`failed to execute cmd:?``" dot -Tpng"``. stderr: `Format:?``"png"`?`not recognized.`
`Use one of: canon cmap cmapx cmapx_np dot eps fig gv imap imap_np ismap pic plain plain-ext pov ps ps2 svg svgz tk vml vmlz xdot '`
我們需要手動安裝 graphviz
`https:``//graphviz.gitlab.io/_pages/Download/Download_source.html`
下載源碼包,并編譯安裝
```
`tar xf graphviz.tar.gz`
`cd graphviz-2.40.1`
`./configure`
`make`
`make install`
```
- 技能知識點
- 對死鎖問題的理解
- 文件系統原理:如何用1分鐘遍歷一個100TB的文件?
- 數據庫原理:為什么PrepareStatement性能更好更安全?
- Java Web程序的運行時環境到底是怎樣的?
- 你真的知道自己要解決的問題是什么嗎?
- 如何解決問題
- 經驗分享
- GIT的HTTP方式免密pull、push
- 使用xhprof對php7程序進行性能分析
- 微信掃碼登錄和使用公眾號方式進行掃碼登錄
- 關于curl跳轉抓取
- Linux 下配置 Git 操作免登錄 ssh 公鑰
- Linux Memcached 安裝
- php7安裝3.4版本的phalcon擴展
- centos7下php7.0.x安裝phalcon框架
- 將字符串按照指定長度分割
- 搜索html源碼中標簽包的純文本
- 更換composer鏡像源為阿里云
- mac 隱藏文件顯示/隱藏
- 谷歌(google)世界各國網址大全
- 實戰文檔
- PHP7安裝intl擴展和linux安裝icu
- linux編譯安裝時常見錯誤解決辦法
- linux刪除文件后不釋放磁盤空間解決方法
- PHP開啟異步多線程執行腳本
- file_exists(): open_basedir restriction in effect. File完美解決方案
- PHP 7.1 安裝 ssh2 擴展,用于PHP進行ssh連接
- php命令行加載的php.ini
- linux文件實時同步
- linux下php的psr.so擴展源碼安裝
- php將字符串中的\n變成真正的換行符?
- PHP7 下安裝 memcache 和 memcached 擴展
- PHP 高級面試題 - 如果沒有 mb 系列函數,如何切割多字節字符串
- PHP設置腳本最大執行時間的三種方法
- 升級Php 7.4帶來的兩個大坑
- 不同域名的iframe下,fckeditor在chrome下的SecurityError,解決辦法~~
- Linux find+rm -rf 執行組合刪除
- 從零搭建Prometheus監控報警系統
- Bug之group_concat默認長度限制
- PHP生成的XML顯示無效的Char值27消息(PHP generated XML shows invalid Char value 27 message)
- XML 解析中,如何排除控制字符
- PHP各種時間獲取
- nginx配置移動自適應跳轉
- 已安裝nginx動態添加模塊
- auto_prepend_file與auto_append_file使用方法
- 利用nginx實現web頁面插入統計代碼
- Nginx中的rewrite指令(break,last,redirect,permanent)
- nginx 中 index try_files location 這三個配置項的作用
- linux安裝git服務器
- PHP 中運用 elasticsearch
- PHP解析Mysql Binlog
- 好用的PHP學習網(持續更新中)
- 一篇寫給準備升級PHP7的小伙伴的文章
- linux 安裝php7 -系統centos7
- Linux 下多php 版本共存安裝
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤
- nginx upstream模塊--負載均衡
- 如何解決Tomcat服務器打開不了HOST Manager的問題
- PHP的內存泄露問題與垃圾回收
- Redis數據結構 - string字符串
- PHP開發api接口安全驗證
- 服務接口API限流 Rate Limit
- php內核分析---內存管理(一)
- PHP內存泄漏問題解析
- 【代碼片-1】 MongoDB與PHP -- 高級查詢
- 【代碼片-1】 php7 mongoDB 簡單封裝
- php與mysql系統中出現大量數據庫sleep的空連接問題分析
- 解決crond引發大量sendmail、postdrop進程問題
- PHP操作MongoDB GridFS 存儲文件,如圖片文件
- 淺談php安全
- linux上keepalived+nginx實現高可用web負載均衡
- 整理php防注入和XSS攻擊通用過濾