PHPをWindowsのアプリケーション .exeにコンパイルするっていう話。

5年ほど前PHPがまだ4系全盛だった頃に一回やったことがあったのだが、
今回、再びやらなければならないことが出てきたので、調べた結果をあげておく。


まず、PHPという言語をWindowsで扱う際、
いいことは、基本的には、Windowsだからといって、
よほど複雑なことをしない限りは、
LinuxやBSD系とそれほど変わらない感覚で使える点。
他のインタプリタで言えば、
Perlをよく使うのだが、Perlなどはファイル名に日本語が入る可能性がある場合などは、
別個にモジュールをロードしてくる必要がある、
よく使うよなと思うモジュールがWindows用にコンパイルされたバイナリがない
など骨が折れることもおおいけれど、
PHPならよほど変なことをしなければ、
php.iniをいじるなどでどうにかできる。

ただし、IronRubyとかには負けちゃうけどね…
 
ま、とにかく、なんだかんだ言われながらもよく使う言語であるPHPで
さくっと小さなアプリが作れるのは楽だ。


5年ほど前に、日本でよく紹介されていた、
PHPを.exeにコンパイルするツールは
http://www.bambalam.se/bamcompile/
これ。
当時使ってみたが、まぁ特に問題もなく。
EXEができた記憶がある。
開発が止まっていて、使えるバージョンはPHP4.4.4。
小さなバッチを書くには十分かなと。

でも、せっかくなら、PHP5で書きたいよなーって調べていたら、あった。
しかも日本人が作ってたのが、、、
これだ

1…
2…
3…
http://hirata-create.cocolog-nifty.com/blog/HC-Standalone-B.html

コンパイルツールがGUIで用意されているのが楽。
これを使えば、WindowsGUIアプリも作れる。
使われているPHPのバージョンは5.3.8。
こういったプロジェクトは、放棄される可能性が高いが、
メンテも頻繁に行われいるようで、いいねいいね


PHPをexeにする仕組みは、

  1. PHPをバイトコードにコンパイルする
  2. windowsのexeファイルを作るプロジェクトの中にバイトコードとPHPのコアであるphp.dllを内包する
  3. コンパイル
  4. 実行時、exeファイルのリソースのなかで、PHPのコードをdllに読ませる

という仕組みでできているようだ。
http://www.sukikamo.jp/users/norihiro/programming/20111104.html
▲参考

つまり、ランタイムとコードをまるごとexeの中に入れちゃってるっていう仕組みである。


上記の、ひらたクリエイトさんのツールの場合、
php.dllを独自にカスタマイズしたものを使っているようで、
それに合わせて、PHPのモジュールも独自のものを使わなくてはならないようだ。
PHPの全資産がそのままつかえるわけではないのがちょっとぐぬぬとなる点である。
(他のコンパイルツールは、同バージョンのPHPのエクステンションdllがそのまま使えるものが多い)


exeにコンパイルした場合の注意点としては、
前述のような、リソースのなかにすべてのものを同梱して
インタプリタに解釈させるという仕組みから、
たとえば、テキストファイルを相対パスで指定したりする場合には、
インタプリタから見たパスの場所がずれるため、
通常どおりのパスが指定できない点を注意する。

この解決方法はRES://というURLスキーマを利用する。

$file = '../data/data.txt';
$usage_path  =  'res:///PHP/' . strtoupper(md5($file));

このように書くと、php.dllから見た相対パスが取得できる。

この点を注意すればあとは通常どおりのPHPでWindowsアプリケーションが作れる。


これまで、PHPの他、Perlやなでしこなどを使ってexeファイルを作ってきたが、
速度の面ではPHPが圧倒的に早いようだ。
今後も使ってみようと思う。


追伸。
Perlをexeにする場合は、
http://www.activestate.com/perl-dev-kit
を使うとできる。
なんと、こいつ、PerlをCOM用のDLLを作ることもできるのだが、
仕組みがわかったので、PHPでもDLLつくれるんじゃねぇの?ということに気づいたため、
今度作ってみようと思う。多分誰も得しないが。。。