PHP7をEXEにコンパイルする方法(PHP7+WinBinder+VBS)

試行錯誤の結果実行ファイルできたっぽいので、やり方を書いておきます。
環境:WIN7home
長い前置きを飛ばしたい方はこちら


最近いろいろあって、PHPを実行ファイルに変換する方法を探していました。
検索で調べてみると「bamcompile」と「HC-Standalone-S+」というツールの二つを発見。
WinBinderで表示デザインをしてツールでコンパイルすればOKということなのでやってみました。


一つ目のbamcompileはPHPの実行エンジンを組み込んでいるのでコンパイル後は単体で動作可能。
しかし組み込まれている実行エンジンがPHP4のため古い。
またキャッシュの影響なのかコンパイルに成功したり失敗したりでとにかく安定しませんでした。


二つ目のHC-Standalone-S+は最新のPHP7が使えてツールがGUIのため多少わかりやすかったです。
しかしアプリケーションタイプのwindowsでは環境のせいかどうしてもコンパイル後に起動できず、WinBinderを使ったWindowsアプリケーションは作成できませんでした。(ブラウザモードなら作成できた)


ほとほと困り果てて、PHPバージョンはもうなんでもいいからちゃんとPHP+WinBinderを(現環境で)コンパイルできるツールはないのか!」と探していたところ、見つけました!
それがこちらのツール「P2X」です!(ででん!)
http://www.vector.co.jp/soft/dl/win95/prog/se365730.html
自分で言うのもなんですが、よくこのツール見つけられたな…というレベルの引っかからなさ。
それもそのはず、このツールは2005年に作られて更新されていないので古いし、作ったサポートホームページはとっくに消滅しているからです。
なのでダウンロードできなくなったら終わり…はやくダウンロードするんだ!(消えたら再配布するかもしれん)


P2Xは自分で用意したPHP実行エンジンごとEXEファイルにコンパイルできます。
その仕様のおかげでPHP7やPHP5の最新版にも対応させることができます。古いツールですが、WIN7でも動きました。
難点としては実行エンジンごとコンパイルするので容量が重い(最小容量が8MBぐらい)のと、起動時にCUIのコンソールが表示されてしまうことと、閉じ方が悪いとTEMPフォルダに残ってしまうことですかね。そのあたりはこの後説明します。
商用利用はメール連絡するように書いてありましたが…このメルアド生きてるのかなw


ではやり方を順に説明していきます。
必要なファイルが多くダウンロードするものがいっぱいあります。
リンクは無断記載なので怒られたら直します。(棒)
初心者なので説明わかりにくいです。暗号化などは無視しています。やり方はあると思うので調べてみてください。
環境によってはうまくいかないこともあるかもしれませんのでご了承ください(ぺこり)


(追記)
作ることはできるのですが、MVCなどの機能はないため、思っているようなプログラムは作れないかもしれません。ちゃんとしたものを作りたい場合はVC++のほうがいいと思います。


1.P2Xをダウンロードする。
メイン環境のP2Xをダウンロードします。コード編集などもこのフォルダ内で行うことになりがちなので、使いやすいところに環境を作ってください。
今回は「C:\p2x\」とした場合で話を進めます。
「P2X」
http://www.vector.co.jp/soft/dl/win95/prog/se365730.html
フォルダ階層はこうなっています。

p2x               
 ├ pack          
 |  └ index.php 
 ├ sample        
 ├ devp2x.exe    
 ├ p2x.exe       
 ├ pkp2x.exe     
 └ readme.txt    

readmeに使い方が詳しすぎるほど乗っています。サンプルは使わないので削除してもOK。今回devp2x.exeの使い方も割愛します。
「pack」フォルダ内にコンパイルするデータを入れることになります。
今回は作業フォルダとしても使っていますが、作業フォルダは別に作ってもかまいません。


2.PHP実行エンジンをダウンロードする。
プログラムで使いたいPHPバージョンの実行エンジンをダウンロードします。(重い)
今回使用したのはphp7.0.1です。VC14 x86 Thread Safeをダウンロードします。
http://windows.php.net/download/#php-7.0
PHP5の場合はWinBinderが対応している5.3.3がいいと思います。この後の環境づくりはPHP7でもPHP5でもあまり変わりません。
古いのでアーカイブからダウンロードしてください。
http://windows.php.net/downloads/releases/archives/
php-5.3.3-Win32-VC9-x86.zip


3.P2X環境にダウンロードしたPHP実行エンジンをコピーする。
一つのプログラムにつき一つのPHP実行エンジンが必要になりますので移動よりコピー推奨です。
「pack」フォルダ内にPHP実行エンジンをフォルダごとコピーして、フォルダ名を「php」にリネームします

p2x               
 ├ pack          
 |  ├ index.php 
 |  └ php(php-7.0.1-Win32-VC14-x86をリネーム)
 |     ├ dev
 |     ├ ……
 |     └ php.ini(php.ini-developmentをリネーム)
 ├ p2x.exe       
 ├ pkp2x.exe     
 ├ compile.bat(自作)
 └ cuistart.bat(自作)

コピーしたら早速動作チェックしてみましょう。index.phpには最初からハローワールドが書いてあります。
php.iniはどちらでもいいですが今回はphp.ini-developmentをリネームします。
「P2X」はCUIで呼び出す必要があるのでバッチファイルを作ります。今回はcompile.batとします。
テキストファイルをcompile.batにリネームして、中のテキストを下のように書きます。
compile.bat

pkp2x.exe
pause

pauseは無くてもOKだけど一応。作成したら上のフォルダ階層のように置いてください。


compile.batを実行します。

成功と出ればコンパイル完了です。
フォルダ内に「a.exe」というファイルができています。P2Xの場合は作成されるファイル名を変更できません。
a.exeを実行するとハローワールドが表示されます。すぐ閉じてしまうのでCUIテストのためにcuistart.batも作っておきましょう。
cuistart.bat

a.exe
pause

cuistart.batを実行します。

クレジットの後にハローワールドが表示されます。「P2X」で作ったものは必ずクレジットが入ってしまいます。最終系がGUIであれば関係ないですが、消したい人はバイナリエディタでがんばってください。
エラーになったり、ハローワールドが表示されない場合は何かがおかしいです。
おかしいところが無い場合は、現在の環境では「P2X」を使えない可能性がありますのでこの後の説明は役に立ちません。ブラウザバックしてください…またきてね!


4.PHP実行エンジンを軽量化
無事コンパイルできたら容量を確認してみてください。とてつもなく重いです。
これは「pack」フォルダ内のすべての要素をコンパイルしているからです。「php」フォルダ内の殆どのファイルはいらないので整理します。

p2x               
 ├ pack          
 |  ├ index.php 
 |  └ php
 |     ├ ext
 |     | ├ php_mbstring.dll(使うdllだけ)
 |     | └ ……
 |     ├ php.exe
 |     ├ php7ts.dll(php5ts.dll)
 |     └ php.ini
 ├ p2x.exe       
 ├ pkp2x.exe     
 ├ compile.bat
 └ cuistart.bat

php実行エンジンはは、「php.exe」と「php7ts.dll」さえあれば動きます。
さらに設定用の「php.ini」と拡張機能の「ext」フォルダを残しておきます。
その他のフォルダとファイルは基本使わないので削除しても大丈夫です。使う場合だけ残しておいてください。
「ext」フォルダ内も使わない拡張機能は削除しておきましょう。特に目的がなければmbstring以外いらないでしょう。今回はmbstringだけで進めます。
これで再度コンパイルすると9MBぐらいにはなるはずです。
もっと容量を減らしたい場合はphp.ini内のコメントを削除するとかしてください。
php.iniの設定は追加するdllがあるので後でやります。(もちろん今やっておいてもOK)


5.WinBinderをインストール
PHPGUI化するのに今回は「WinBinder」を使うのでダウンロードします。
最新版でいいと思います。WinBinder.2010.10.14.zip
http://winbinder.org/download.php
古いphpバージョン(5.1以下)を使う場合はWinBinder-0.46.0.zipもダウンロードしてください。
php」フォルダ内にコピーします。

p2x               
 ├ pack          
 |  ├ index.php 
 |  └ php
 |     ├ ext
 |     | ├ php_mbstring.dll
 |     | └ php_winbinder.dll(WinBinderの拡張dll)
 |     ├ WinBinder
 |     | └ phpcode
 |     |      └ include
 |     |           ├ ……
 |     ├ php.exe
 |     ├ php7ts.dll(php5ts.dll)
 |     └ php.ini
 ├ p2x.exe       
 ├ pkp2x.exe     
 ├ compile.bat
 └ cuistart.bat

「WinBinder」フォルダ内も同じくいらないファイルがあるので削除します。
「phpcode\include」フォルダと「binaries」フォルダ以外はいりません。
「binaries」フォルダにはPHPの各バージョンにあわせた「php_winbinder.dll」が入っていますので「ext」フォルダに移動させてください。
移動させたら後はいりませんので削除してください。
最新版にはphp5.3.3だけが入っています。
php7の場合はヒラタクリエイトさんが提供?しているものを使用しますのでダウンロードしてください。(提供元が確認できませんでした)
WinBinder_PHP-7-0.zip
https://docs.google.com/uc?authuser=0&id=0B76nq_y0gvBpcHVuR003UlRIZnM&export=download
php5.1以下はWinBinder-0.46.0.zipに入っています。
バージョンにあわせた「php_winbinder.dll」がない場合は動かない可能性がありますので注意してください。


6.php.iniの特殊設定
「P2X」での設定と「php_winbinder.dll」を使うための設定します。
php.ini

//extension_dirを以下に変更(P2Xでのルール)
extension_dir = "<<TEMP>>/php/ext/"
//extensionはmbstringを使うのでセミコロン外す
extension=php_mbstring.dll
//extensionの下にphp_winbinder.dllも追加
extension=php_winbinder.dll
//date.timezoneを東京に
date.timezone = "Asia/Tokyo"
//mbstringの設定(お任せで)
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = Off
mbstring.detect_order = auto


7.メイン環境完成+動作テスト
これでメイン環境の構築は完了です。お疲れ様でした。
あとは用途に応じて追加していってください。
動作テストをします。
今回は自分で作るのが面倒だったのでサンプルプログラムをお借りします!お借りします!すいません!
http://www.pahoo.org/e-soul/webtech/php04/php04-04-01.shtm
サンプルプログラムから「makepassword.phpw」と「makepassword.rc」を「pack」フォルダにコピーします。

p2x               
 ├ pack          
 |  ├ index.php(makepassword.phpwをリネーム)
 |  ├ makepassword.rc 
 |  └ php
 |     ├ ext
 |     | ├ php_mbstring.dll
 |     | └ php_winbinder.dll
 |     ├ WinBinder
 |     | └ phpcode
 |     |      └ include
 |     |           ├ ……
 |     ├ php.exe
 |     ├ php7ts.dll(php5ts.dll)
 |     └ php.ini
 ├ p2x.exe       
 ├ pkp2x.exe     
 ├ compile.bat
 └ cuistart.bat

「makepassword.phpw」は「index.php」にリネームします。「P2X」では最初に呼ばれるソースはindex.phpで固定です。
「P2X」ではこのままでは動かないため、「index.php」を一部修正します。
index.php

include 'php/WinBinder/phpcode/include/winbinder.php';			// WinBinderライブラリ

eval(parse_rc(file_get_contents(dirname(__FILE__).'/makepassword.rc'), '$mainwin', NULL, ResizableWindow, APPNAME, WBC_CENTER, WBC_CENTER, 320, 280, 0, 0));

修正は適当です。もっとうまいやり方あると思うのでお任せします。
修正したら「compile.bat」を実行してコンパイルします。
今回はGUIなので「a.exe」をそのまま実行して動作確認できます。サンプルプログラムのGUIが表示できれば成功です。
動かなかった場合は「cuistart.bat」を実行するとエラーを表示できるのでそこを修正しましょう。
注意として、動作中にコンソールを強制的に閉じてしまうと(右上の閉じるボタンなど)、TEMPフォルダにプログラムがたまってしまうのでお気をつけください。


8.コンソールを消すためにVBSから起動する
プログラムはコンパイルできて完成しましたが、GUIプログラムでもコンソールが残ってしまいます。
「P2X」では必ずCUIでのコンパイルになるので非表示にできません。
また、うさみみハリケーンなどでCUIからGUIに変更してみてもバイナリエディタで文字削ってみてもコンソールを非表示にはできませんでした。
仕方が無いので単体プログラムを諦め、VBSから起動します。

p2x               
 ├ pack          
 |  ├ index.php
 |  ├ makepassword.rc 
 |  └ php
 |     ├ ext
 |     | ├ php_mbstring.dll
 |     | └ php_winbinder.dll
 |     ├ WinBinder
 |     | └ phpcode
 |     |      └ include
 |     |           ├ ……
 |     ├ php.exe
 |     ├ php7ts.dll(php5ts.dll)
 |     └ php.ini
 ├ p2x.exe       
 ├ pkp2x.exe     
 ├ compile.bat
 ├ cuistart.bat
 ├ bin.exe(a.exeをリネーム)       
 └ start.vbs

a.exeでは格好が悪いので好きにリネームします。今回はbin.exe。
start.vbs

Set ws = CreateObject("Wscript.Shell") 
ws.run "bin.exe", vbhide

「start.vbs」を書いたら実行します。実行するとGUIだけを表示することができました。
MakeExeを使ってvbsをEXEファイルに変換します。
http://www.vector.co.jp/soft/winnt/prog/se389017.html
最終的に提供するプログラムは「bin.exe(メインプログラム)」と「start.exe(bin.exeを呼び出すだけのプログラム)」の二つになりました。
これだったら他のも外でよかったな…


etc.P2Xについて
有能なツールですが弱点は結構ありそうです。
・入出力のプログラムのネームが固定のため複数のプログラムを作るときは混同しがち
・コンソールから強制終了するとTEMPが消えずに残るので容量圧迫する(p2x0〜)
・暗号化はしてくれない


側の用意は整ったのであとは中身を作りこむだけですね…