PHP程序员开发win32应用程序之梦

1 篇文章 0 订阅
1 篇文章 0 订阅

相信做纯WEB开发的PHP程序员都会想过,要是PHP能开发windows本地应用程序多好,于是上网一查找出来的很多都是“PHP-GTK”的老文章,这东西好像已经没人维护了,随便看了下,也就没去细研究了。


前阵子折腾了node-webkit,这东西可以用javascript + chorme内核blink 开发本地应用,满足纯WEB程序员开发本地应用程序的梦想。

node-webkit有几个优点:

1、内置blink内核,跟随google升级,支持现代浏览器特性,妈妈再也不用担心我的浏览器兼容问题了

2、内置nodejs,就是加强版的javascript,WEB程序员入手快,nodejs功能强大

3、入门级开发流程比较简单,没有太多看不明白的东西

4、跨平台,三大操作系统都可用

5、国人开源项目,现在在github上很热门

缺点:体积太大。  写个hello wold,嗯,20M以上。 试了不少压缩方法,最少的也要17M以上,头痛

有道词典前阵子也开源了类似项:叫有道hex,但我比较看好node-webkit,社区更活跃更成熟。


因为自己是PHPer,自然是写PHP才够酸爽,于是又在想其它解决方案。

有没有一个绿色的php web server软件呢,这样可以把软件做成绿色版,不用特意去安装apache nginx之类的东西。

功夫不负有心人,找到了一个叫QuickPHP的东西,作者本意是想做个方便快速调式PHP脚本的工具,歪打正着,收下了。

研究了一会,发现是delphi写的软件,用exescope处理下,修改几处文字和菜单,尽量不显示出这货是QuickPHP

再用C++边学边开发,弄个简易的浏览器,其实就是生成一个窗体,里弄个IE控件上去。 启动窗体的时候,用C代码启动QuickPHP,然后隐藏QuickPHP的窗体


折腾两天,成果截图

运行 localphp.exe可以看到效果


其中php.ini和ext目录非必须,为了使用一些PHP扩展才加上

除掉非必要的扩展目录(ext),剩下的文件打包压缩完就小几M,还算满意


demo中的功能利用了js的异步请求,达到无刷新操作。当然你还可以优化css样式、禁止js报错、禁止复制文字、禁止右键菜单等手段让它看去更像客户端

本身php就有很多可以控制操作系统的函数,再加上可以用exec()执行命令行代码,所以PHP能做的事情就很多了。



============================

了解C的基础上趁热打铁又看了深入了解PHP内核的相关文章,感觉自己进入了一个全新的世界,和大牛们的差距不是一点点,加油吧。

随着进一步了解,发现了更多类似的项目 http://stackoverflow.com/questions/9046675/convert-a-php-script-into-a-stand-alone-windows-executable

改天测试测试,写测评

============================

以后会把新测试过的项目简单做个记录,不定时加在本文后面

打包发布工具:

1、打包成安装文件 Inno Setup (  http://www.jrsoftware.org/isdl.php )

2、所有文件打包成单个exe文件 Enigma Virtual Box

============================

ZZEE PhpExe ( http://www.zzee.com/phpexe/ )

这个工具可以帮你PHP项目生成一个exe文件,有很多生成exe的配置可选择,运行生成的exe文件,会打开一个窗口,窗口里就是内嵌web页面

生成的应用程序几个文件加起来压缩前也只有2M多

PHP文件默认被打包隐藏,也可以选择是否加密

注册费$99,试用版在打开你生成的exe后要先显示10秒指定信息


phpdesktop ( https://code.google.com/p/phpdesktop/ )


根目录下有个 settings.json ,很多配置项,基本够用

PHP代码文件放在指定目录下,没有加密,谁都可以查看

项目开源,有能力者可以用C语言修改后重新编译

分为IE内核版和chrome版,PHP版本比较新,有v5.4和v5.5(不支持xp),chorme版本也比较新

IE内核版压缩包15MB,简化版5MB,IE版本依赖于操作系统

chrome内核版压缩包40MB,简化版本30MB,因为自带了一个chorme浏览器内核,体积自然小不下来,但优势也是显而易见的,支持现代浏览器特性,不像IE各版本有兼容问题。

两个简化版解压后用inno setup打包完,IE版4.56MB,chrome版21.7MB

官方介绍中还有指导如何加密php


WinBinder ( http://winbinder.org/ )


不同于上面的 ZZEE PhpExe 和 phpdesktop 使用内嵌webbrowser方式运行,WinBinder以CLI方式运行PHP,开发了自己的扩展 php_winbinder.dll,PHP代码使用扩展提供的接口调用win32api,从而实现真正的本地应用程序窗口。

可以到这里下载最新版本zip包 http://winbinder.org/download.php  最后一次更新是2010年10月14日,php版本为5.3.3

解压后打开目录 phpcode\examples 看到里面有一大堆 *.phpw文件,phpw文件就是PHP文件,换个后缀而已,这里全是小demo,值得每个都运行一次查看

phpcode/form_editor 是一个可视化建窗工具,也是php写的,100K左右的代码,可以像在VB里一样用鼠标布局,然后导出相应的PHP代码

phpcode/make_release 是发布工具,可以生成各种类型的发布版本

有个叫WbObjects的项目 ( http://wiki.swiftlytilting.com/WbObjects ),针对winbinder规范做了一层封装,应该会更好用?


运行方法:

1、再打开binaries\php533 目录,看到里面有php.exe文件, 把选择一个*.phpw 拖动到 php.exe上面即可

2、在桌面创建一个binaries\php533\php.exe快捷方式,在“目标” 里后面加上“ phpw文件路径”,即相当于用命令行模式执行php, 这个PHPer应该都会吧

3、也可以在其它应用程序中execute(),殊途同归

php_winbinder.dll 里定义了一系列基本接口,大部分控件都可以调这些接口得到。

但我想用其它win32api怎么办? 这时WinBinder强大体现出来了,可以在PHP中加载其它DLL如

    $USER = wb_load_library("USER");
    $KERNEL = wb_load_library("KERNEL");
    $GDI = wb_load_library("GDI");
借助USER,花一小会功夫做了一个自动发送旺旺消息的“外挂”,(win7 64位 ,旺旺2013版)

<?php

/*******************************************************************************
自动发送旺旺消息 by i@huanglixiang.com
*******************************************************************************/

//------------------------------------------------------------ SYSTEM PARAMETERS

define("PATH_SCRIPT",	dirname(__FILE__) . "/");
define("PATH_INC",		PATH_SCRIPT . "../include/");

define("WM_SETTEXT", 12); //定义与C一样的常量
define("WM_KEYDOWN", 256);
define("VK_RETURN",13);


//----------------------------------------------------------------- DEPENDENCIES

include PATH_INC . "winbinder.php";

//-------------------------------------------------------------- EXECUTABLE CODE

// Load User library
$USER = wb_load_library("USER");

$wanwang_messge['from'] = '' //消息发起方旺旺名;
$wanwang_messge['to'] = '' //消息接收方旺旺名; 如果有自定义显示名字的,要用显示名字

$hwnd = FindWindow('StandardFrame', $wanwang_messge['to'].' - '.$wanwang_messge['from']);

if($hwnd) {
	$hwnd_SplitterBar = FindWindowEx($hwnd,NULL,'SplitterBar','');
	if($hwnd_SplitterBar){
		//wb_message_box(null, 'SplitterBar found.', '', WBC_INFO);
		$hwnd_StandardWindow1 = FindWindowEx($hwnd_SplitterBar,NULL,'StandardWindow',NULL);
		$hwnd_StandardWindow2 = FindWindowEx($hwnd_SplitterBar,$hwnd_StandardWindow1,'StandardWindow',NULL);
		
		if($hwnd_StandardWindow2){
			//wb_message_box(null, 'hwnd_StandardWindow2 found.', '', WBC_INFO);
			$hwnd_RichEditComponent = FindWindowEx($hwnd_StandardWindow2,NULL,'RichEditComponent',NULL);
			if($hwnd_RichEditComponent){
				//wb_message_box(null, 'hwnd_RichEditComponent found.', '', WBC_INFO);
				
				SendMessage($hwnd_RichEditComponent, WM_SETTEXT,  0, 'test php');
				SendMessage($hwnd_RichEditComponent, WM_KEYDOWN, VK_RETURN, '0');
				
				
			}else{
				wb_message_box(null, 'hwnd_RichEditComponent not found.', '', WBC_INFO);
			}
			
			
		}else{
			wb_message_box(null, 'hwnd_StandardWindow2 not found.', '', WBC_INFO);
		}
	}else{
		wb_message_box(null, 'SplitterBar not found.', '', WBC_INFO);
	}
	
} else {
	wb_message_box(null, 'StandardFrame not found.请确认旺旺聊天窗口已打开,并且$wanwang_messge[\'from\']和$wanwang_messge[\'to\']设置正确', '', WBC_INFO);
}

//------------------------------------------------ FOREIGN FUNCTION DECLARATIONS

function FindWindow($class, $title)
{
	global $USER;
	static $pfn = null;

	if($pfn === null)
		$pfn = wb_get_function_address("FindWindow", $USER);
	return wb_call_function($pfn, array($class, $title));
}

function FindWindowEx($phwnd , $chwnd, $class, $title)
{
	global $USER;
	static $pfn2 = null;

	if($pfn2 === null)
		$pfn2 = wb_get_function_address("FindWindowEx", $USER);
	return wb_call_function($pfn2, array($phwnd , $chwnd,$class, $title));
}

function SendMessage($hwnd, $msg,  $wParam, $lParam){
	global $USER;
	static $pfn = null;

	if($pfn === null)
		$pfn = wb_get_function_address("SendMessage", $USER);
	return wb_call_function($pfn, array($hwnd, $msg,  $wParam, $lParam));
}


//-------------------------------------------------------------------------- END

?>

总之使用WinBinder最好有一定的win32开发知识,包括win32接口的使用和系统消息机制。

PS,还有其它能调用win32api的PHP扩展,如php_w32api.dll和php_ffi.dll 已经都没什么人维护。

这项目还是开源哦,赞一个


Bamcompile ( http://www.bambalam.se/bamcompile/ )

这是一个将php文件/项目“编译”并打包成exe的工具,下载后发现使用非常简单,只有一个bamcompile.exe,然后再看examles目录,每个demo里有个complie.bat,运行后即生成一个exe的PHP应用程序,exe文件只有小几百K,已经包括了PHP代码,和解释运行PHP代码的代码,可以独立运行,如此神器,令人发指!

其中说一说examples/calculate 这个项目,用记事本查看 compile.bat和calculate.bcp, 相信过计算机二级的高中同学都能看懂。编译后运行,居然是一个win32窗体的计算器!查看calculate里的文件发现,这不就是本文前面介绍的那个WinBinder项目里的一个例子吗。原来如此,结合winbinder和bamcompile,一个完美的PHP版本win32应用程序就这样产生了

有兴趣的同学可以认真看完作者的官网页面介绍,说是目前只支持php 4.4.4,php 5版本的他不一定什么时候跟进

项目是开源、免费的,有能力的同学可以改造一下,能升级到php 5.x就好了,毕竟大家用得最多的是5.x版本


exeoutput ( http://www.exeoutput.com/ )


看介绍还是不错,但是要付费且不开源,所以就不想细测试了,下个案例demo,还提示要先下载安装个 runtime模块,这。。。不知道这样会被用户骂死吗

可以从他介绍页得知一部分信息:

1、能把php项目打包成独立exe文件,php代码加密而非简单打包

2、支持选择IE或chrome做为内嵌浏览器

看到官网上几个demo截图,感觉UI挺丑的。即不如原生UI的淳朴,又不华丽,就是一个村姑级的品味

优点我觉得,应该是提供了UI接口,可以感觉做出来的项目像一个没有地址栏的浏览器。本地应用程序的菜单 + 内嵌webrowser + 隐藏的php web server 的感觉

感觉似winbinder和phpdesktop 部分功能的结合体


PHPPy ( https://github.com/mbrostami/PHPPy )

python做的一个项目,对python没兴趣,不测


Phalanger  ( http://www.php-compiler.net/ )

“the PHP compiler for .NET ” 看第一行就没兴趣了,不测


Phc-win ( http://wiki.swiftlytilting.com/Phc-win )


phc-win is an open source PHP compiler for Windows. It compiles PHP scripts to PHP-native bytecode and then produces an EXE file containing your compiled code
介绍很直白了。还是拿了WinBinder那个计算器程序做demo

解压后双击打开phc-win.exe,然后通过file菜单把整个phc-winbinder-example目录打包后生成一个exe文件,php文件也被转成php bytecode存在exe里了,php code转bytecode利用的是php_bcompiler.dll扩展。

运行的时候还需要几个依赖文件

* php5ts.dll
* php_win32std.dll
* php_bcompiler.dll
* php-embed.ini

再加上自身exe文件,至少有5个文件是必需的。 本例还需要php_winbinder.dll 扩展,共6个文件

相比 bamcompile ,貌似没有什么优势,但 bamcompile还停留在支持php 4.4.4,(老天为什么这么不公平。。。)

看看Phc-win的源码(source\phc-win.0.3.1里),额,好熟悉,原来也是用WinBinder实现的。不禁佩服PHPer真是八仙过海,各显神通

根目录下几个文件功能说明:

* phc-win.exe 主程序入口,这个程序源代码是source目录下

* bcomp.exe 将php代码转成加密的phb代码

* embeder2.exe 将php项目生成exe文件

phc-win.exe这个文件比较有意思。 如果把phc-win.exe生成的程序都姓A的话 phc-win.exe就是始祖A0 ,通过A0生成的子孙就是A1 A2...那是谁生成A0呢,应该是WinBinder吧


=============================

转载请标明出处 http://blog.csdn.net/xiangzi1113/article/details/38387995

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值