百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

aardio + PHP 可视化快速开发独立 EXE 桌面程序

nanshan 2025-04-07 17:08 21 浏览 0 评论

aardio 支持与很多编程语言混合开发。
网络上大家分享的 aardio + Python 混合开发的文章很多,aardio + PHP 的文章却很少。

其实 aardio 与 PHP 混合开发是真的简单 !

CGI 调用 PHP

aardio 虽然很小,但自带嵌入式 HTTP 服务器,通过 CGI 调用 PHP 也非常简单。

这种方式就跟平时用 PHP 写网站基本一样了,而且兼容所有 PHP 版本。下面我们直接看 aardio 代码示例:

import win.ui;
var winform = win.form(text="PHP_CGI 服务器");

import web.form;
var wb = web.form( winform);

//启动 PHP CGI 服务端
import process.php;

//获取 PHP 页面网址
var url = process.php("/res/test.php");

//调用浏览器组件显示网页
wb.go(url);

winform.show();
win.loopMessage();

是不是非常简单?
这就是一个完整的 aardio + PHP 程序。

上面短短几句代码包含了:
图形界面、浏览器组件、PHP 服务端、HTTP 服务器。

aardio 把所有需要操心的事都默默地做好了,例如 HTTP 服务器会自动分配空闲端口,不同程序不会相互冲突。在需要时会自动启动 HTTP 服务端线程,在界面线程退出时 —— 自动退出 HTTP 服务端,所有这些都会自动处理好。

至于下面的代码会返回访问 "/res/test.php" 的 HTTP 地址:

var url = process.php("/res/test.php");

支持内嵌资源目录下的文件路径:

如果软件自带 PHP 组件,在 aardio 中占击「发布」生成 EXE —— 可点击「转换为独立 EXE」按钮生成单 EXE 程序:

CGI 调用:更换 PHP 环境

process.php 默认会自动搜索 php-cgi.exe,搜索顺序如下:

1、\php\php-cgi.exe 
2、环境变量 PHP_CGI_EXE_PATH 指定的位置
3、path 环境变量指定的目录下查找 php-cgi.exe
4、自注册表搜索
5、C:\Program Files\PHP 目录下搜索
6、ardio 中 PHP 扩展库自带的  ~\lib\php\.dll\php-cgi.exe

也可以用 process.php.cgiPath 明确指定路径,例如:

process.php.cgiPath = "~\lib\php\.dll\php-cgi.exe"

或者改为导入下面的库,改用 php 扩展库自带的 PHP 5.2 CGI 服务端:

import process.php.5.2;

也可以改为导入 PHP 5.6 环境( 运行时会自动检测或安装 PHP 5.6 ):

import process.php.5.6;

导入上面这些带版本号的库就不用再导入 process.php 了。使用库时候仍然要去掉版本号,直接使用 process.php。

可以看一下这几个库的源码,代码很少只有几句,参考一下就可以改为调用任意版本 PHP 环境了。

PHP CGI 回调 aardio

aardio 创建的嵌入 HTTP 服务端不但可以执行 PHP,也可以执行 aardio 代码,aardio 用于写网站服务端时 —— 支持与 PHP 基本一样的模板语法, 请参考 《aardio 语法与使用手册 > aardio 语言 > aardio 模板语法 》。

那么利用上面这个特性,实际上我们可以在 PHP 代码里用 file_get_contents 等函数直接请求 aardio 代码或者 aardio 函数。下面看一个完整的示例:

import win.ui;
/*DSG{{*/
var winform = win.form(text="PHP CGI 回调 aardio";right=753;bottom=434)
winform.add(
edit={cls="edit";left=20;top=12;right=734;bottom=404;edge=1;multiline=1;z=1}
)
/*}}*/

var code = /* array(  'method' => 'POST', 'header' => 'Content-type:application/json',  'content' => $data, 'timeout' => 15 * 60  ));
  $context = stream_context_create($options);
  $result = file_get_contents('http://'.$_SERVER['HTTP_HOST'].'/json', false, $context);
  return json_decode( $result );
}

//PHP 调用 aardio 的速度更快
for ($i=1; $i<=20; i sendjson array> 'tom', 'value' => 22 ) );
	sleep(1);
}

?>*/
string.save("/test.php",code);

import process.php.5.2;

//注册服务端线程全局变量
process.php.threadGlobal = { 
	winform = winform; 
}

/*
可选用下表添加自定义 HTTP 处理函数,键名指定 HTTP 请求路径。
PHP 也可以直接请求 aardio 工程里的 aardio 文件( 支持资源文件 )。

请注意 HTTP 处理函数都是多线程函数。线程函数内使用的库要单独导入。
线程函数不能直接访问外部对象,但可以通过 process.php.threadGlobal 访问窗口或控件对象。
*/
process.php.httpHandle = {
	["/json"] = function(response,request,session){
		
		//解析 JSON 返回 aardio 表对象
		var data  = request.postJson();
		..winform.edit.print("PHP 请求了,参数:",data) 
		 
		//输出表对象时会自动转换为 JSON
		response.write({a:123}); 
	} 
}

//通知 PHP 页面启动
process.php.notify("/test.php");

winform.show();
win.loopMessage();

上面的 PHP 代码我就不解释了,能看这篇文章的肯定是 PHP 玩得比我好了。

这里我重点解释一下后面那句 aardio 代码:

process.php.notify("/test.php");

这句代码实际上创建了一个线程,然后调用 inet.http().location() 发送了一个 HTTP 请求,且不会等待 PHP 输出数据就直接关闭连接。因为上面我们只是启动 PHP,并不需要 PHP 输出的数据,这样可以让界面线程运行更流畅。

嵌入 PHP

aardio 提供了 php 扩展库可以直接调用 PHP 的解释器。

php 扩展库自带的 PHP 版本为 v5.2 ,这个版本的好处是体积非常小,兼容到 XP,不需要额外再安装其他 C++ 运行库。其实用来写一般的桌面程序够用了。如果您希望使用高版本 PHP —— 请改用前面讲的 CGI 方式调用。

aardio 嵌入式调用 PHP 示例:

import php;
import console; 
  
//PHP代码
var phpcode =/* 
	$a="我是PHP中的变量a";
	function main(){
    	global $a;
    	return $a." 这是main()函数的返回值";
	};  
*/ 

//运行 PHP 代码 
php.exec(phpcode)  

//运行 PHP 代码,调用 PHP 函数返回值 
var ret = php.eval("main()") 
console.log( ret );
 
//运行 PHP 代码,返回表达式的值
var ret = php.eval("8899") 
console.log( ret );

//再用 eval 函数访问 PHP 中的变量
var ret = php.eval("$a") 
console.log( ret );

//更简单一些,直接读 PHP 中的变量,注意去掉变量前面的$符号
console.log("直接读取PHP中的变量", php.a ) 

//同上,也可以直接修改 PHP 中的变量 
php.global_abc = 2011
 
//请注意: PHP返回给aardio的值都是字符串类型
console.pause();

aardio 与 PHP 语法对比

请参考:aardio 编程语言快速入门——语法速览

要注意 PHP 5.2 默认编码为 GBK,而 aardio 默认编码为 UTF-8 编码。

PHP 的注释语法与 aardio 一样,

PHP 语句也以分号结束,并且分号不能象 aardio 那样省略

PHP 中的所有变量必须以 $ 符号开始。 $号是变量的修饰前缀,但不是变量名称的一部分

在PHP中函数内部变量默认为局部变量(这与aardio,Javascript正好相反),使用 global 语句引入或声明全局变量

PHP单引号中是纯文本,类似 \n 这样的转义符不起作用,而双引号中可以使用转义符,aardio中也有类似的机制,不过规则正好相反。aardio中双引号中才是普通文本,单引号中支持转义符。

更多语法对比请参考:
aardio 范例 > 调用其他语言 > PHP > 语法比较

PHP 调用 aardio

aardio 调用 PHP,PHP 再回调 aardio 代码:

import php;
import console;
 
//PHP代码
var phpCode =/* 
	$ret = aardio("
		import win;
		import web.json;
		
		win.msgbox('我是 aardio 代码');
		return web.json.stringify({a=123;b=456});
	")
*/ 

//运行PHP代码,返回表达式的值
var ret = php.eval(phpCode) 
console.log( ret );

console.pause();

注意: aardio 返回给PHP的值都是字符串类型, PHP 调用的 aardio 代码使用 return 语句返回值。

嵌入PHP:自定义 PHP 输出

为了方便测试,首先用下面的 aardio 代码生成测试 PHP 文件:

phpcode = /*
<?php 
	echo "

Hello World

"; phpinfo(INFO_ALL); ?> */ string.save("/test.php",phpcode )

然后用 aardio 调用上面的 test.php :

import php;
php.print = function( msg ) {
 
	import console;
	console.log(msg);
	console.more();
}

//执行 PHP 文件
php.dofile("/test.php")

在 aardio 中只要简单的定义 php.print 函数,就可以捕获 PHP 的输出数据了。

嵌入 PHP:重置 PHP 解释器

下面直接看 aardio 代码如何重置 PHP 解释器:

import php;
import console;

//打开控制台
console.open();

//重置 PHP 解释器
php.begin()

	php.eval("$a=123");
	console.log( php.a );
	
php.end()

//重置 PHP 解释器
php.begin()

	php.eval("$b=456");
	
	//注意这里PHP中的变量$a已经失效
	console.log( php.a,php.b );
	
php.end()


console.pause(); 

混合不同编程语言只是可选项

aardio 虽然可以方便地混合很多编程语言,但混合编程仅仅是可选项。下面这些很受欢迎的桌面软件 —— 都是使用纯 aardio 代码编写。

相关推荐

ubuntu24.04下kubernetes1.30环境搭建

设置root用户密码#在Ubuntu系统中,默认情况下root用户是被禁用的(没有设置密码)#而是通过sudo命令让普通用户临时获取管理员权限,#如果需要启用或修改root密...

Canonical 在 Ubuntu 24.10 发布之前对 Snap 进行了更多改进

作为Ubuntu桌面临时工程总监,OliverSmith介绍了Ubuntu24.10的最新进展。在Ubuntu24.10功能冻结之前,GNOME47测试版已经登陆Ubuntu...

Ubuntu Touch OTA-5手机系统发布:细化电源配置等

IT之家8月2日消息,UBports基金会于7月30日发布UbuntuTouch20.04OTA-5版本更新,距离上次OTA-4更新发布相隔6个月时间。Ubuntu...

Ubuntu更契合英特尔酷睿Ultra,综合性能比Win11高15%

IT之家12月23日消息,英特尔本月推出酷睿UltraMeteorLake处理器,那么Win11和Ubuntu发行版两者时间,谁能更好地发挥其性能呢?国外科技媒体phoron...

针对英特尔酷睿CPU优化,Canonical发布Ubuntu实时内核

IT之家7月27日消息,Canonical今天宣布针对支持时序协调运算(TCC)和时间敏感网络(IEEETSN)的英特尔酷睿处理器,推出优化版实时Ubuntu内核。Canonical...

在Ubuntu/Debian上设置永久DNS域名服务器

在Linux上设置自定义DNS服务器可以提高性能和安全性,甚至可以通过DNS阻止一些使用地理屏蔽的网站。有几种方法可以做到这一点,包括在许多Linux发行版中包括的NetworkManagerGUI...

宣布延期:Ubuntu 24.04 LTS第一个版本发布推迟两周

Ubuntu开发团队原计划于8月19日星期四发布Ubuntu24.04.1LTS。然而,由于发现几个重大升级错误,发布被推迟。Ubuntu24.04.1LTS的新发布日期现定为...

Ubuntu系统已经十岁了 10月新推14.10版

|责编:李鑫比较非主流的Ubuntu系统刚刚推出了14.10版,同时大家也可能不知道其实它已经十岁了!它的第一次公布时间为2004年的10月呢。在这次十周年更新中,Ubuntu为用...

wsl2在休眠后的时间偏差问题的修复

笔记本电脑在日常使用中,常常会有进入休眠状态的情况。休眠对于wsl2而言,却造成了时间偏差的问题,休眠期间wsl2的时间停止了。这个问题的根治,需要等微软。本文提供的是一种简单的修复办法。ntp是网络...

基于Ubuntu22.04源码安装配置RabbitVCS过程记录

基于Ubuntu22.04源码安装配置RabbitVCS过程记录安装开始时间开始时间:2025年7月18日17:09(北京时间)系统:Ubuntu22.04用户:itgather时区:A...

GNOME 46桌面环境发布,Ubuntu 24.04 LTS和Fedora 40率先预装

IT之家3月21日消息,GNOME团队今天发布公告,正式推出代号为“Kathmandu”的GNOME46桌面环境,并已经开放下载。Fedora40发行版将于4月发布,率先预装...

如果大家同意的话 Ubuntu可能很快就会有一个新的垃圾桶图标

Ubuntu贡献者目前正在构思一个新的垃圾桶图标,该图标最早可能在10月份Ubuntu25.10发布时出现在Dock栏中。关于Ubuntu垃圾桶图标外观的讨论在2019年持续进...

Ubuntu 25.10 通过更安全地获取时间来提供进一步的安全性提升

Canonical宣布将从Ubuntu25.10开始使用一款名为chrony的软件,以实现更安全的时间管理。最终用户无需过于担心这一变化,但它将增强系统安全性,尤其是在加密操作和证书验证方...

Linux 修改系统时间的两种方式

一:更新系统时间的方式1、手动修改通过相关工具来手动修改系统的时间。2、自动同步使用NTP自动同步系统时间。二:手动修改系统时间1、date工具作用:显示和设置系统时间选项:-d<字符串&g...

Ubuntu计划下版本为RISC-V设置RVA23基线,大量硬件无法升级

IT之家7月14日消息,主要Linux发行版之一的Ubuntu计划在其接下来的一个大版本25.10中将对RISC-V处理器的准入门槛设置从此前的RVA20配置文件更新至最新...

取消回复欢迎 发表评论: