aardio + PHP 可视化快速开发独立 EXE 桌面程序
yuyutoo 2024-11-10 13:47 2 浏览 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 = /*<?php
//禁止缓存
header("Cache-Control:no-cache,must-revalidate,no-store");
header("Pragma:no-cache");
ignore_user_abort(true); // 后台运行
set_time_limit(0); // 取消脚本运行时间的超时上限
function sendJson($data) {
$data = json_encode($data);
$options = array('http' => 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( 'name' => '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 语法对比
要注意 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 "<p>Hello World</p>";
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 代码编写。
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)