我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

前文描述了图表生成软件graphviz的安装,在实际应用中,这个软件安装好之后,就基本上不用动了,都是用命令行和它进行交互的。所以请确认已经可以在命令行下找到dot这个可执行文件。

苏南大叔:php如何生成节点图?例如调用graphviz功能画图表? - php生成节点图
php如何生成节点图?例如调用graphviz功能画图表?(图7-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,记录苏南大叔和计算机代码的故事。本文描述php通过dotgraphviz进行交互,最终生成了节点图的经验。测试环境:win10php@7.4.3ntsgraphviz@8.0.1

安装phpgraphviz

php的安装这里就不做描述了,大家都会。graphviz这个软件不常见,安装经验请参考:

关键点是:需要确认在命令行下可以直接找到dot这个可执行文件。(比如把bin目录加入到环境变量)。

苏南大叔:php如何生成节点图?例如调用graphviz功能画图表? - dot-help
php如何生成节点图?例如调用graphviz功能画图表?(图7-2)

配置php.ini

如果使用php调用dot程序,那么,就需要开启一个“邪恶函数”。所以,可能需要配置php.inidisable_functions。具体可以参考:

本文选择使用passthru()函数(就是不把这个函数配置到php.ini中)。

编写dot描述文件

需要执行dot命令行,要生成的图形需要使用dot语言进行描述,并保存到一个.dot文件中。当然是个.txt的记事本文件也是可以的,后缀并不重要。

本文的测试内容是个有向图,内容为:

digraph G {su->nan->da->shu,su->da}

这个dot语言的具体使用方法并不是本文的主要侧重点,可以参考:

苏南大叔:php如何生成节点图?例如调用graphviz功能画图表? - dot文件范例
php如何生成节点图?例如调用graphviz功能画图表?(图7-3)

苏南大叔:php如何生成节点图?例如调用graphviz功能画图表? - 表示的节点图
php如何生成节点图?例如调用graphviz功能画图表?(图7-4)

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如何生成节点图?例如调用graphviz功能画图表? - dot生成文件
php如何生成节点图?例如调用graphviz功能画图表?(图7-5)

直接输出文件内容

实际上就是不生成实际文件,而是在命令行下直接输出文件的二进制。虽然看起来并不受用,但是和php配合的时候却是非常好用,就是不传递-o参数。例如:

生成图片:

dot g.dot -Tpng

生成pdf:

dot g.dot -Tpdf

生成svg图片:

dot g.dot -Tsvg

苏南大叔:php如何生成节点图?例如调用graphviz功能画图表? - dot-直接显示二进制
php如何生成节点图?例如调用graphviz功能画图表?(图7-6)

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");

苏南大叔:php如何生成节点图?例如调用graphviz功能画图表? - php代码
php如何生成节点图?例如调用graphviz功能画图表?(图7-7)

这个代码中,目前肉眼可见的最大问题就是:节点图的描述代码dot文件,需要先保存成一个文件,才能传递到命令行里面,似乎有些繁琐和不堪。

相关文章

在这里,不得不提另外一篇php+画图的文章,就是php调用imagick的文章。在下面这篇文章中,imagick的调用是利用php的扩展完成的,而不是通过命令行的方式:

总结

更多苏南大叔的文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    graphviz