OSX 10.11安装XHProf的经验和教训

旧博客迁移文章,内容可能已失去价值,仅为留念,做了简单重新排版,勉强可看。

2015/10/25更新:OSX下使用xhprof在某些情况下会致使网站崩掉 ,建议还是不要在OSX下玩这个扩展。

写在前面:鉴于我遇到非常多奇葩的问题,我决定好好写这篇文章,把经验分享给别人。遇到这些问题的原因,可能是系统原因,也可能是软件原因,因为编译过程漫长,本人不愿意花太多时间在上面,仅在过程中记下认为的原因。

鉴于本人在查这方面资料的时候,很多人连同Apachenginx的安装也一同写在教程里,让我有点乱。所以提醒一下,实际上XHProf与它们关系不大,它只是一个php扩展而已。

接下来,我们就一步一步来安装吧!

基本部分

  1. 下载xhprof,并解压。
    1:版本可以下载最新的0.9.4版本,但本人下载0.9.4版本安装后,使用phpinfo()函数查看时,显示为0.9.2,不知道谁骗了偶(:
    2:OSX默认没有wget,你可以自己安装或在用浏览器下载。 bash wget http://pecl.php.net/get/xhprof-0.9.3.tgztar -zxvf xhprof-0.9.3.tgz
  2. 编译安装 bash cd ./xhprof-0.9.3/extension/phpize./configure --with-php-config=tmpmakesudo make installmake test 这里需要注意几点:
    (1) 执行phpize时,可能会报错,结果如下: >Configuring for:PHP Api Version: 20121113Zend Module Api No: 20121212Zend Extension Api No: 220121212Cannot find autoconf. Please check your autoconf installation and the$PHP_AUTOCONF environment variable. Then, rerun this script.

这是什么原因呢?因为*autoconf没有装,autoconf是什么?
Linux/Unix开发有关系,我也不太理解,你可以看看这篇博文
实际上需要装两个东西,
autoconfm4*,那安装吧!
地址: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 Extras extension=xhprof.soxhprof.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](http://php.net/manual/zh/book.xhprof.php)  
 带`simple`的是更轻量级版本,所以其实就多了两个。然后怎么用?  
 先看一下我的目录结构:  
[![](https://st.xiaoyuyu.cn/blog/img/xhprof_001.png)](https://st.xiaoyuyu.cn/blog/img/xhprof_001.png)

在网站根目录创建`xhprof`文件夹  
`examples`、`xhprof_html`、`xhprof_lib`文件夹是从源代码包里直接复制过来的。  
`examples`是使用示例文件  
`xhprof_html`是呈现分析结果的web界面  
`xhprof_lib`是性能分析需要的库  
再来看一下示例文件`sample.php`,英文注释已删,并做了一些简单修改。
```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 会得到这样的结果: osx-xhprof-1

点count

osx-xhprof-2 这里就是分析结果啦!如果想要以图象形式显示,点[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.0graphviz-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
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,可以考虑一下方面:

  1. graphviz-gd是否安装;
  2. graphviz版本可以适当降低
  3. 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

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 3269 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments