sqonk/phext-visualise

Visualise 是一个跨平台的非交互式图形输出显示,用于在命令行 SAPI 中运行 PHP 8。它可以在窗口中显示渲染后的图像,并使用 Java 作为引擎实现实时更新。

1.0.1 2022-12-28 02:43 UTC

This package is auto-updated.

Last update: 2024-09-29 15:29:25 UTC


README

Minimum PHP Version Minimum PHP Version License

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.

Graphs

当仅使用单个窗口和单个图像时,您还可以使用生成器进一步简化您的代码。

这个简单的动画演示了使用方法

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.');

Sine Wave

致谢

Theo Howell

许可证

麻省理工学院许可证(MIT)。有关更多信息,请参阅许可文件