[xhprof|OSX|autoconf|m4|Graphviz|libpng]
写在前面:鉴于我遇到非常多奇葩的问题,我决定好好写这篇文章,把经验分享给别人。遇到这些问题的原因,可能是系统原因,也可能是软件原因,因为编译过程漫长,本人不愿意花太多时间在上面,仅在过程中记下认为的原因。
鉴于本人在查这方面资料的时候,很多人连同Apache,nginx的安装也一同写在教程里,让我有点乱。所以提醒一下,实际上XHProf与它们关系不大,它只是一个php扩展而已。
接下来,我们就一步一步来安装吧!
基本部分
- 下载xhprof,并解压。
注 1:版本可以下载最新的0.9.4版本,但本人下载0.9.4版本安装后,使用phpinfo()
函数查看时,显示为0.9.2,不知道谁骗了偶(:
注 2:OSX默认没有wget,你可以自己安装或在用浏览器下载。
wget http://pecl.php.net/get/xhprof-0.9.3.tgz
tar -zxvf xhprof-0.9.3.tgz
- 编译安装
cd ./xhprof-0.9.3/extension/
phpize
./configure --with-php-config= mp\nmake
sudo make install
make test
这里需要注意几点:
(1) 执行phpize
时,可能会报错,结果如下:
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
这是什么原因呢?因为autoconf没有装,autoconf是什么?
跟Linux/Unix开发有关系,我也不太理解,你可以看看这篇博文。
实际上需要装两个东西,autoconf和m4,那安装吧!
地址:http://ftp.gnu.org/gnu/autoconf/和http://ftp.gnu.org/gnu/m4/
wget http://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz
tar -zvxf m4-1.4.17.tar.gz
cd m4-1.4.17/
./configure && make && sudo make install
cd ../
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar -zvxf autoconf-2.69.tar.gz
cd autoconf-2.69/
./configure && make && sudo make install
(2)--with-php-config=
后的目录是什么目录呢?不知道的话,执行:
which php-config
我这里是/usr/bin/php-config
3.修改php.ini。在php.ini最后加上
extension=xhprof.so
xhprof.output_dir=输出目录
输出目录,默认为/tmp,你可以自己修改,一定要注意该目录的必须有写权限**,直接777吧!本人在这吃过亏。
到这里你的xhprof就算安装完毕了。不过实际上还没完。
使用部分
xhprof既然是php扩展,我们就要理解什么是扩展,本人就把它理解成多了几个牛逼的函数。这里多了四个:
xhprof_enable()
xhprof_disable()
xhprof_sample_enable()
xhprof_sample_disable()
详细可以看这里:http://php.net/manual/zh/book.xhprof.php
带simple
的是更轻量级版本,所以其实就多了两个。然后怎么用?
先看一下我的目录结构:
在网站根目录创建xhprof文件夹
examples、xhprof_html、xhprof_lib文件夹是从源代码包里直接复制过来的。
examples 是使用示例文件
xhprof_html是呈现分析结果的web界面
xhprof_lib是性能分析需要的库
再来看一下示例文件sample.php,英文注释已删,并做了一些简单修改。
<?php
//foo()是要分析的函数
function bar($x) {
if ($x > 0) {
bar($x - 1);
}
}
function foo() {
for ($idx = 0; $idx < 5; $idx++) {
bar($idx);
$x = strlen("abc");
}
}
// 开始分析,在xhprof_enable()和xhprof_disable()之间的是要分析的代码部分
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
foo();
//这里就结束分析了,可见之分析了foo()的执行过程,xhprof_disable()会返回分析的结果
$xhprof_data = xhprof_disable();
print_r($xhprof_data);
//获取xhprof所在的路径
$XHPROF_ROOT = realpath(dirname(__FILE__) .'/..');
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();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
//访问http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo 就可以看到统计列表
//<xhprof-ui-address>是指xhprof_html的路径地址,如下示例:
echo '<a href="http://localhost/xhprof/xhprof_html/index.php?run='.$run_id.'&source=xhprof_foo" target="_blank">count</a>';
现在我们来访问http://localhost/xhprof/examples/sample.php 会得到这样的结果:
点count
这里就是分析结果啦!如果想要以图象形式显示,点[View Full Callgraph],当然你还需要安装Graphviz,装这个,本人遇到大坑(如果你和我都是OSX10.11,其它版本未测)。先看效果:
安装Graphviz可以去它官网下载。
一定要下载graphviz-2.39.20151005.2011.pkg
一定要下载graphviz-2.39.20151005.2011.pkg
一定要下载graphviz-2.39.20151005.2011.pkg
如果你和博主一样,作死下源码编译,或者下载graphviz-2.38.0.pkg,你会遇到一下各种错误,一部分而已,抱歉博主没有整理完全部的错误,有的错误一去不复返,再也找不回。
错误1
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 xdot1.2 xdot1.4 '`
错误2:
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-2.30.0 Or graphviz-2.32.0以前会报这个错:
Undefined symbols for architecture x86_64
graphviz-2.30.0 Or graphviz-2.32.0到graphviz-2.36.0,会报这个:
ln: graphviz/tcl: Operation not permitted
make[5]: *** [install-data-hook] Error 1
make[4]: *** [install-data-am] Error 2
make[3]: *** [install-am] Error 2
make[2]: *** [install-recursive] Error 1
make[1]: *** [install-recursive] Error 1
make: *** [install] Error 2
graphviz-2.38.0 编译不会报错,但是点[View Full Callgraph]出现:
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 xdot1.2 xdot1.4 '`
如果出现下面这种:
/usr/include/tk.h:78:11: fatal error: 'X11/Xlib.h' file not found
include <X11/Xlib.h>
1 error generated.
make[3]: *** [tkStubLib.lo] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
可以这样解决:ln -s /opt/X11/include/X11 /usr/local/include/X11
对于非OSX用户,如遇以上错误1错误2,可以考虑一下方面:
- graphviz-gd是否安装;
- graphviz版本可以适当降低
- libpng可以适当降低
网上成功过的为graphviz-2.24.0 + libpng-1.5.19,作为参考吧!
看到有人说出现类似上述错误1错误2,是因为Graphviz没安装,其实不是,没安装的话,会是 Command Not Found.
最后提醒大家,设置的xhprof.output_dir目录一定要具有写权限,本地直接给权限777就ok。
附几篇参考博文:
http://blog.sina.com.cn/s/blog_721cd3390102uzx8.html
http://www.cnblogs.com/casatwy/archive/2013/01/17/2865241.html
http://www.chenjie.info/1587