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
的扩展完成的,而不是通过命令行的方式:
总结
更多苏南大叔的文章,请参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。