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来查看分析日志了。
![image](https://upload-images.jianshu.io/upload_images/6954572-7ed8193cff957374.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果点击 [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攻击通用过滤