相信做纯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 PARAMETERSdefine("PATH_SCRIPT",   dirname(__FILE__) . "/");
define("PATH_INC",      PATH_SCRIPT . "../include/");define("WM_SETTEXT", 12); //定义与C一样的常量
define("WM_KEYDOWN", 256);
define("VK_RETURN",13);//----------------------------------------------------------------- DEPENDENCIESinclude 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 DECLARATIONSfunction 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

PHP程序员开发win32应用程序之梦相关推荐

  1. 程序员开发什么小程序挣钱_作为程序员赚钱的5种独特方式

    程序员开发什么小程序挣钱 1.赚钱报告错误 (1. Make money reporting bugs) You can earn money by helping other companies f ...

  2. db和model用哪个开发大型项目 thinkphp_Java程序员开发大型应用程序时,必须要掌握几个的技巧...

    假如你是一名Java开发者,正在开发和维护包含2000个类并使用了很多框架的应用程序.你要如何理解这些代码呢?在典型的Java企业项目小组中,大部分能够帮你的高级工程师看起来都很忙,文档也很少.你需要 ...

  3. 那些年,程序员开发过的好玩的程序

    作者:小渡|来源:Duing 前言 都说,程序员们有一个共同的梦想:用代码改变世界.2020年是特殊的一年,我们经历了疫情.洪水.台风--,在这个过程中,程序员也运用代码技术发挥了重要的力量. 代码技 ...

  4. 趣文:程序员/开发人员的真实生活

    本文借用了多张动态图,以诙谐的方式,展示了程序员/开发人员的真实生活.文章原始版本是西班牙语,由 Alex Soto 翻成了英文版,再由伯乐在线翻成了中文版. 往工作环境上传东西的时候: 没有&quo ...

  5. 2017年秋招美团Java程序员开发,看我如何拿到offer

    转载自  2017年秋招美团Java程序员开发,看我如何拿到offer 本人是一名本科毕业非计算机专业的程序员,面了阿里,结果没过,最后面上了美团,热乎乎的面经,昨天面的美团,虽然面完了HR面,但是感 ...

  6. 《程序员开发心理学》阅读笔记一

    今天开始阅读<程序员开发心理学>这本书,只是开了个小头. 这本书的开篇就提到了作者对于阅读程序的看法,正如老师交给我们的一样,在学习编程的时候第一步就是要学习,只有多看别的的程序.代码才有 ...

  7. 程序员开发软件的意义到底在哪?

    有一篇热文<写了 8 年的代码,做过的项目都下线了,程序员的意义在哪里!>,作者 8 年工作和业余时间开发几十个项目,几乎都关闭了. 想当初,很用心的去开发每一个项目:如今,这些项目只能一 ...

  8. 2017年美团Java程序员开发,看我如何拿到offer

    2017年美团Java程序员开发,看我如何拿到offer 热乎的面经,昨天面的美团,虽然面完了HR面,但是感觉希望不大,希望能走运拿到offer吧.三面技术面面经如下: 一面: 中间省略掉大概几个问题 ...

  9. 活久见!程序员开发进度太慢被公司告上法庭,索赔 90 万!

    loonggg 读完需要 5 分钟 速读仅需 2 分钟 大家好,我是校长. 真的是开眼了,活久见啊,公司因为嫌弃程序员开发进度太慢,耽误上线,竟然将程序员告上了法庭,要求程序员赔偿公司经济损失 90 ...

最新文章

  1. 思科——RIP的运用
  2. 【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )
  3. oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园
  4. 《Android构建MVVM》系列(一) 之 MVVM架构快速入门
  5. oracle11gasm,Oracle11gASM之ACFS创建案例
  6. 有效利用时间12妙招
  7. 负载均衡工具 haproxy 集群安装部署完整流程
  8. sql server2008密钥
  9. 对话机器学习大神Yoshua Bengio(下)
  10. 德州大学达拉斯分校计算机科学,德克萨斯大学达拉斯分校排名
  11. 贫富分化是生产力发展的必然趋势 zz
  12. screenX、clientX、pageX, offsetX的区别
  13. adb环境搭建以及使用教程
  14. win7用html做桌面,win7系统怎么制作主题桌面,win7系统制作主题桌面方法
  15. 58同城校招题-判断既是回文,又是质数的数字
  16. Linux 下qW3xT.2,解决挖矿病毒
  17. 安装ps显示计算机丢失adobe,win7系统安装PS显示检查许可证所需的adobe application manager丢失或损坏的解决方法...
  18. 服务器启动项目抛错 没有到主机的路由
  19. 常见积分和导数的推导
  20. linux多重引导工具,Linux多重引导器

热门文章

  1. Ubuntu 20.04 Server 使用命令行设置 IP 地址
  2. JAVA 16方格排序游戏
  3. matlab怎么把音频变成信号_利用MATLAB软件对音频信号进行频谱分析及处理.doc
  4. 自来水管道铺设问题——数学建模
  5. 传奇GEE引擎版本如何封挂?GEE引擎设置简单的封挂脚本教程
  6. gom及gee小白架设黑屏的原因以及个别装备地图不显示怎么办?
  7. webpack serve 配置问题TypeError: Class constructor ServeCommand cannot be invoked without ‘new‘
  8. linux基础--认识文件以及vi编辑器
  9. 篮球记分牌c语言程序和报告,基于单片机的篮球比赛电子记分牌最终版(备份存档)...
  10. 紫光集团赵伟国:拒绝资本高手标签 做好科技产业重炮手