failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
xhprof为facebook的php性能分析工具使用实例如下:
http://localhost/xhprof/examples/sample.php http://localhost/xhprof/xhprof_html/callgraph.php?run=56839487285fa&source=xhprof_foo
使用xhprof时,图片查看时[View Full Callgraph],出现以下错误
failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
各种goole,stackoverflow,说需要安装graphviz,好了,本人mac使用brew安装
brew install graphviz
安装成功了,再试,依然提示以上错误。
而我直接在命令行输入 dot -V是正常的
bash-3.2# dot -V dot - graphviz version 2.38.0 (20140413.2041)
那么就是php运行环境有问题了,然后就排查 xhprof的 callgraph.php,最后定位到
xhprof/xhprof_lib/utils/callgraph_utils.php 的 xhprof_generate_image_by_dot 函数
function xhprof_generate_image_by_dot($dot_script, $type) {
$descriptorspec = array(
// stdin is a pipe that the child will read from
0 => array("pipe", "r"),
// stdout is a pipe that the child will write to
1 => array("pipe", "w"),
// stderr is a pipe that the child will write to
2 => array("pipe", "w")
);
$cmd = " dot -T".$type;
$process = proc_open( $cmd, $descriptorspec, $pipes, sys_get_temp_dir(), array( 'PATH' => getenv( 'PATH' ) ) );
if (is_resource($process)) {
fwrite($pipes[0], $dot_script);
fclose($pipes[0]);
$output = stream_get_contents($pipes[1]);
$err = stream_get_contents($pipes[2]);
if (!empty($err)) {
print "failed to execute cmd: \"$cmd\". stderr: `$err'\n";
exit;
}
fclose($pipes[2]);
fclose($pipes[1]);
proc_close($process);
return $output;
}
print "failed to execute cmd \"$cmd\"";
exit();
}
问题出现在callgraph_utils.php 112行:
proc_open( $cmd, $descriptorspec, $pipes, sys_get_temp_dir(), array( 'PATH' => getenv( 'PATH' ) ) );
其中
getenv( 'PATH' ) 输出为:/usr/bin:/bin:/usr/sbin:/sbin
而使用brew 安装 的dot在
/usr/local/bin/dot
所以我追加了 在后面如下:/usr/local/bin
proc_open( $cmd, $descriptorspec, $pipes, sys_get_temp_dir(), array( 'PATH' => getenv( 'PATH' ).':/usr/local/bin' ) );
在访问,可以出正常分析图片了。