sqonk / phext-visualise
Visualise 是一个跨平台的非交互式图形输出显示,用于在命令行 SAPI 中运行 PHP 8。它可以在窗口中显示渲染后的图像,并使用 Java 作为引擎实现实时更新。
Requires
- php: ^8.0
- phpstan/phpstan: ^1.9
- sqonk/phext-core: ^1
Requires (Dev)
- phpunit/phpunit: ^9
This package is auto-updated.
Last update: 2024-09-29 15:29:25 UTC
README
Visualise 是一个跨平台的 非交互式 实时图形输出显示,用于在命令行 SAPI 中运行 PHP 8。
图像帧可以使用 GD 构建,并直接传递给 Visualise,或者可以通过其他方式(例如,从文件或 URL)生成或获取,通过提供预渲染的图像数据作为字符串。
它使用在子进程中运行的 Java 平台,该平台使用 PCNTL 扩展将每个窗口绑定到父 PHP 脚本。
安装
通过 Composer
$ composer require sqonk/phext-visualise
要求
- PHP 8.0+
- PCNTL 扩展
- POSIX 扩展
- GD 扩展
- Java 8+(OracleJDK 或 OpenJDK)。
您必须安装完整的 JDK,而不仅仅是 JRE,这将安装 java 和 javac(编译器)工具。
API 参考
请参阅API 参考以获取有关可用方法的完整文档。
哲学
在尝试构建简单的脚本或验证概念时,倾向于保持任何输出都是基于文本的,并在命令行范围内。虽然这可以避免很多额外的体积和工作,使程序能够与图形用户界面一起工作,但它也限制了可以向用户显示的信息类型(通常是编写代码的开发人员)。
桌面图形用户界面通常带有事件循环和其他控制框架,这迫使您将代码结构化以适应其系统。
同样,Web 应用程序,PHP 的主要使用领域,在请求-响应周期中运行,每次运行都会产生新的脚本运行实例。
这两种情况都增加了一定程度的复杂性,这增加了开发时间。
也许您正在尝试一个验证概念的想法,您希望快速启动,或者您对命令行脚本有简单的需求,但希望在屏幕上显示图形更新,而无需大幅改变您的逻辑。Visualise 可以通过适应您的代码来解决此问题,而不是反过来。
为什么选择 Java?
原生 PHP 扩展有一个很坏的习惯,几乎在语言每个主要版本中都会出现破坏。对于支持 GUI 绑定的各种扩展 - 一旦维护者失去兴趣或转移到其他地方,就会与语言的后续修订版失去兼容性。
相比之下,用户解决方案在应对语言和平台变化方面有着更好的记录。
Java 自 90 年代以来一直存在,广泛用于企业,并在 OS X、Linux 和 Windows 上可靠运行。更重要的是,该引擎提供了适用于所有三个平台的预包装安装程序。
Visualise 的 Java 方面不需要任何第三方 Java 库,并使用语言大部分生命期中存在的工具,例如 Swing UI。
示例
使用 PlotLib 运行一系列图表,总共 4 个,并将所有这些输出到 1 个窗口,每个循环渲染一个新的 x 系列值。
require_once 'vendor/autoload.php'; use sqonk\phext\visualise\Visualiser; use sqonk\phext\plotlib\BulkPlot; $visualiser = new Visualiser; $windowID = $visualiser->open(title:'graphs', width:1000, height:850, imageCount:4, posX:20, posY:25); $values = []; $xs = []; foreach (sequence(start:1, end:100) as $i) { $values[] = rand(1,30); $xs[] = $i; $plot = new BulkPlot; $plot->add(type:'line', series:[$values], options:[ 'title' => 'Lines', 'xseries' => $xs, ]); $plot->add(type:'bar', series:[$values], options:[ 'title' => 'Bars', 'xseries' => $xs, ]); $plot->add(type:'linefill', series:[$values], options:[ 'title' => 'Area', 'xseries' => $xs, ]); $plot->add(type:'scatter', series:[$values], options:[ 'title' => 'Scatter Plot', 'xseries' => $xs, ]); $images = $plot->render(writeToFile:false, width:500, height:400); $visualiser->update(images:$images, windowID:$windowID); } ask('press any key to continue.'); // pause script.
当仅使用单个窗口和单个图像时,您还可以使用生成器进一步简化您的代码。
这个简单的动画演示了使用方法
require_once 'vendor/autoload.php'; use sqonk\phext\visualise\Visualiser; $visualiser = new Visualiser; function adjust($sq): void { $sq->size = $sq->dir ? $sq->size + $sq->step : $sq->size - $sq->step; if ($sq->size > 350) $sq->dir = false; else if ($sq->size < 5) $sq->dir = true; } $Sq = named_objectify('size', 'dir', 'step', 'r', 'g', 'b'); $squares = [ $Sq(5, true, 10, 147,17,50), $Sq(20, true, 5, 148,32,146), $Sq(20, true, 15, 0,0,200) ]; foreach ($visualiser->animate(400, 400, title:'Squares', frames:1000, posX:20, posY:50) as $count => $img) { # prefill white background $white = imagecolorallocate($img, 255,255,255); imagefilledrectangle(image:$img, x1:0, y1:0, x2:399, y2:399, color:$white); imagesetthickness($img, 3); foreach ($squares as $s) { $r = $s->size / 2; $clr = imagecolorallocate(image:$img, red:$s->r, green:$s->g, blue:$s->b); imagerectangle(image:$img, x1:200-$r, y1:200-$r, x2:200+$r, y2:200+$r, color:$clr); adjust($s); } } println('completed.');
致谢
Theo Howell
许可证
麻省理工学院许可证(MIT)。有关更多信息,请参阅许可文件。