php如何生成节点图?例如调用graphviz功能画图表?
发布于 作者:苏南大叔 来源:程序如此灵动~
前文描述了图表生成软件graphviz的安装,在实际应用中,这个软件安装好之后,就基本上不用动了,都是用命令行和它进行交互的。所以请确认已经可以在命令行下找到dot这个可执行文件。

大家好,这里是苏南大叔的“程序如此灵动”博客,记录苏南大叔和计算机代码的故事。本文描述php通过dot和graphviz进行交互,最终生成了节点图的经验。测试环境:win10,php@7.4.3nts,graphviz@8.0.1。
安装php和graphviz
php的安装这里就不做描述了,大家都会。graphviz这个软件不常见,安装经验请参考:
关键点是:需要确认在命令行下可以直接找到dot这个可执行文件。(比如把bin目录加入到环境变量)。

配置php.ini
如果使用php调用dot程序,那么,就需要开启一个“邪恶函数”。所以,可能需要配置php.ini的disable_functions。具体可以参考:
本文选择使用passthru()函数(就是不把这个函数配置到php.ini中)。
编写dot描述文件
需要执行dot命令行,要生成的图形需要使用dot语言进行描述,并保存到一个.dot文件中。当然是个.txt的记事本文件也是可以的,后缀并不重要。
本文的测试内容是个有向图,内容为:
digraph G {su->nan->da->shu,su->da}这个dot语言的具体使用方法并不是本文的主要侧重点,可以参考:


dot生成文件
上述内容保存为g.dot文件,然后就可以使用dot命令生成图片了。比如:
生成图片:
dot g.dot -T png -o g.png生成pdf:
dot g.dot -T pdf -o g.pdf生成svg图片:
dot g.dot -T svg -o g.svg
直接输出文件内容
实际上就是不生成实际文件,而是在命令行下直接输出文件的二进制。虽然看起来并不受用,但是和php配合的时候却是非常好用,就是不传递-o参数。例如:
生成图片:
dot g.dot -Tpng生成pdf:
dot g.dot -Tpdf生成svg图片:
dot g.dot -Tsvg
php调用生成
范例代码如下,不做解释,请保证目录的写权限即可。
function path_join($base, $path)
{
return rtrim(rtrim($base, '/'), "\\") . DIRECTORY_SEPARATOR . $path;
}
$filename = 'g.dot';
$content = "digraph G {su->nan->da->shu,su->da}";
$filepath = realpath(path_join(dirname(__FILE__), $filename));
file_put_contents($filepath, $content);
// header("Content-type: image/png");
// passthru("dot -Tpng $filepath");
header("Content-type: application/pdf");
passthru("dot -Tpdf $filepath");
// header("Content-type: image/svg+xml");
// passthru("dot -Tsvg $filepath");
// header("Content-type: image/png");
// passthru("dot -Tpng $filepath -o pipe.png");
// echo file_get_contents("pipe.png");
这个代码中,目前肉眼可见的最大问题就是:节点图的描述代码dot文件,需要先保存成一个文件,才能传递到命令行里面,似乎有些繁琐和不堪。
相关文章
在这里,不得不提另外一篇php+画图的文章,就是php调用imagick的文章。在下面这篇文章中,imagick的调用是利用php的扩展完成的,而不是通过命令行的方式:
总结
更多苏南大叔的文章,请参考: