在OSX 10.11下安装 XHProf的经验和教训

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

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

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

基本部分

  1. 下载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
  1. 编译安装
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开发有关系,我也不太理解,你可以看看这篇博文
实际上需要装两个东西,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.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的是更轻量级版本,所以其实就多了两个。然后怎么用?
先看一下我的目录结构:

目录结构.png

在网站根目录创建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 会得到这样的结果:

sample.php.png

点count
result.png

这里就是分析结果啦!如果想要以图象形式显示,点[View Full Callgraph],当然你还需要安装Graphviz,装这个,本人遇到大坑(如果你和我都是OSX10.11,其它版本未测)。先看效果:
graphviz.png

安装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,可以考虑一下方面:

  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

原文链接:https://www.funnyang.com/osx-xhprof/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容