1. 程式人生 > >PHP程式設計師開發win32應用程式之夢

PHP程式設計師開發win32應用程式之夢

相信做純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 [email protected]
*******************************************************************************/

//------------------------------------------------------------ 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

相關推薦

PHP程式設計師開發win32應用程式

相信做純WEB開發的PHP程式設計師都會想過,要是PHP能開發windows本地應用程式多好,於是上網一查找出來的很多都是“PHP-GTK”的老文章,這東西好像已經沒人維護了,隨便看了下,也就沒去細研究了。 前陣子折騰了node-webkit,這東西可以用javascri

程式設計師開發學習利器篇(上)百度搜索-你真的會用百度嗎

以下內容,開發初學者看,熟手略過。 論語有言: 工欲善其事 必先利其器 ,意思是工匠想要使他的工作做好,一定要先讓工具鋒利。比喻要做好一件事,準備工作非常重要。 這對於我們程式設計師做開發時也是這樣,充足且好的準備工作,不但可以提高我們的開發效率,同時也可以讓我們事半功倍

2018年 Java程式設計師學習大資料最佳路!

隨著大資料時代的到來,有很多Java程式設計師想要轉行大資料。 不得不說,大資料行業可以說是為Java程式設計師量身打造的一個朝陽行業?為什麼要這麼說呢? 因為Java工程師轉型大資料具有天然進階優勢,不僅僅是前景和薪資等。技術層面來說,大資料使用的Hadoop(在分散式伺服

VC++6.0 Win32應用程式 如何新增窗體 ------阿冬專欄

1、建立一個win32 application。選一個簡單的win32程式。名為win32dialog 2、【插入】-【資源】-選【dialog】-點【新建】 3、點儲存,命名為win32dialog.rc。 4、關掉子視窗(編輯框),左邊 fileview中 【新增檔案到工作區】選上win32di

5.1 Win32應用程式:EXE

  Nico Bendlin的MiniDExe很好地演示了不使用任何Delphi例程來實現一個Win32應用程式的方法。對於一個可執行程式.EXE來說,只須滿足如下條件,就可以在被Windows系統中執行:  是一個以.EXE方式生成的格式正確的PE(Portable Executable)檔案有一個正確的入

程式設計師的而立之年,迷茫

學生時代,一提起三十歲,總覺得遙遠。 “三十歲,而立之年,那該是成家立業,事業小成,被人親切稱為大叔的年齡吧。” 然而隨著畢業工作,三十歲轉瞬即至。除了準備簡單過個生日,其他好像什麼都沒發生。 我依然每天坐在電腦前,聽著音樂寫著各種文件,偶爾再擼下程式碼。 每天按點上班,到點下班,時不時再加加班,

一個程式設計師的自白(無知者)

有人說,父母亦老師,但父母並沒有告訴他人生是用來折騰而不是用來舒服的;有人告訴他,老師是啟蒙者,但老師並沒有告訴他,學無止境原來是跟自己的人性死磕到底。有人告訴他,自己才是人生的主導者,但那人並沒有告訴他,自己永遠無法知道自己不知道的事情。這些真相搞得他在自己面前顯得多麼地無知。

C 程式設計師開發WinForm必須知道的 Window 訊息大全

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

win32應用程式,TCHAR與CHAR的相互轉換

TCHR 與 CHAR相互轉換 含義 TChar to Char CHAR To TCHAR 含義 TCHAR:在Unicode編碼下,為寬字元wchar;在Ansi編碼下,為字元char。 CHAR:是在Ansi編碼下字串格式。

Java程式設計師開發3年如何能拿到年薪40W?(強烈推薦漲薪必備)

年薪達到50萬+,也不一定得碼程式碼,當個苦逼的程式設計師。我有一個哥們,離職隨後半年時間不到,直接上升到年薪50萬的水準,原因很簡單,我的朋友在街邊擺起了茶葉蛋。 ——開個小玩笑,言歸正傳! 同樣是開發了3年,為什麼別人拿高薪而你卻還在做著增刪改查的事? 第一要反思自己

XAMPP下的Tomcat 7執行出現“1% 不是有效的 Win32 應用程式。”

    XAMPP (xampp-win32-5.6.28-1-VC11-installer)安裝後,安裝了JDK 1.7,然後啟動Tomcat 7,服務能安裝上去,但是啟動Tomcat的時候,控制面板按鈕老是停留在“Start”狀態,提示框一直提示“Attempting to

python指令碼報錯:OSError: [WinError 193] %1 不是有效的 Win32 應用程式

遇到問題: python+selenium,執行時報錯: OSError: [WinError 193] %1 不是有效的 Win32 應用程式。 解決方法: 第一步:將程式碼中呼叫谷歌瀏覽器的程式改成呼叫火狐或者其他瀏覽器,再次執行,檢視報錯資訊(如果錯誤一樣,那麼繼續步驟三) 步驟二:步驟一中執行

程式設計師開發常用英語詞彙

Aabstract 抽象的abstract base class (ABC)抽象基類abstract class 抽象類abstraction 抽象、抽象物、抽象性access 存取、訪問access function 訪問函式access level訪問級別account 賬戶action 動作activa

使用Windows API建立一個Win32應用程式視窗

新建一一個專案名為MakeWin的Win32應用程式空專案,然後為其新增一個名為MakeWin的C++原始檔 #include<windows.h> char Name[]="MakeWin"; LRESULT CALLBACK WndProc(HWND,UINT,WPAR

軟技能,程式設計師程式設計之外的升值道!

題記 程式設計師,除了編碼之外的軟技能有哪些呢?《軟技能——程式碼之外的生存指南》33歲實現職業自由、財富自由的作者給出瞭解讀。 書的作者也是程式設計師出身,但書中鮮有的很少涉及程式碼、架構、管理等內容,而是著重講解程式設計師除了程式設計之外的生存技能,娓娓道來,意猶未盡。 書的觀點都很中肯

c#工程師用Visual Studio開發dapp應用程式

最近區塊鏈技術引起了我的注意。我剛開始瞭解它,就看到了區塊鏈去中心化架構的巨大潛力,並且它能夠簡化各種現有繁瑣的流程,通過各種形式的合約。 作為一名.NET開發人員,我主要使用的是一些提供中心資料來源的架構,因此區塊鏈的去中心化概念對我來說是全新的。我很快就看到它如

​​​​​​​C/C++程式設計師必須熟練應用的開源專案 -- 轉

  作為一個經驗豐富的C/C++程式設計師, 肯定親手寫過各種功能的程式碼, 比如封裝過資料庫訪問的類, 封裝過網路通訊的類,封裝過日誌操作的類, 封裝過檔案訪問的類, 封裝過UI介面庫等, 也在實際的專案中應用過, 但是回過頭仔細想想,其實以前自己寫過的這些程式碼,只能

這個程式設計師如何以一己力阻止了 Bug 程式碼的提交併改變整個 DevOps 世界?

【CSDN 編者按】Jenkins 是基於 Java 開發的一種持續整合工具,能夠幫助專案實現高度的工程化,而它的前身則是 Hudson。2004年,Sun 公司的 Java 程式設計師川口耕介為了讓同事的工作更輕鬆些,創立了持續整合工具 Hudson,但這之後,這個工具打敗了許多

Swift 語言開發 iOS 應用程式的利弊

目前全球共有超過 7 億臺 iPhone 處於活躍狀態,這造就了 iOS 作為全球第二大移動裝置平臺的狀態。雖然安卓系統的全球市場佔有率超過 iOS 系統,但在諸如美國、法國和英國的區域性市場中 iOS 系統仍然佔據主導地位。因此許多公司專注於 iOS 平臺進行軟體開發,因為

Android開發系統應用程式

一、配置清單檔案 在 manifest 標籤裡新增屬性:android:sharedUserId=“android.uid.system” 二、打包apk android studio : Build -> Make Project / Rebuild P