Windows 版 PHP build ~ オレオレPHP
クライアント基盤チームのよやです。こんにちは。
需要の少ない話で恐縮ですが、今回は Windows 版 PHP を自分で build する方法を紹介します。
昔、VC6 を使っていた頃に比べ VC9,10 + SDK で build 出来る今は作業が大変簡単になっています。
Unix 系OS で PHP 自体を改造したり、PHP extention を作って組み込む事に慣れていても、Windows では足踏みする事があると思いますが、この記事がその敷居を下げる一助になれば幸いです。
公式の build 手順は以下の場所に説明があります。
公式 Wiki の build 環境に合わせ、Visual Studio 2008 SP1 (VC9) + Windows SDK 6.1 を組み合わせて PHP5.4 を構築する手順と、その際のちょっとしたハマりどころを紹介します。
64bit Windows 環境で build する場合は、"Program Files" を "Program Files (x86)" に読み替えると、そのまま手順が使えます。但し、出来るのは 32bit 版の php.exe です。(*1)
今回の build 手順で作成した exe と関連するファイル一式は以下のサイトから zip でダウンロード出来ます。本当に動くのか先に結果を見たい方はお試し下さい。
Visual Studio C++ SP1 + Windows SDK のインストール
まずはコンパイラの導入です。Express を例にします。
尚、Visual Studio 2010 (VC10) + Windows SDK 7.1 でもほぼ同様の手順で build 出来ます。vc9 を vc10 に、 2008 を 2010 に、6.1 を 7.1 に読み替える事で VC10 版の DLL を作る手順として利用できます。
Microsoft Visual Studio 2008 Express Edition SP1
こちらの vcsetup.exe を実行すると以下のダイアログが出て、Visual C++ 2008 SP1 がインストール出来ます。
- Windows SDK for Windows Server 2008 and .NET Framework 3.5
こちらの Setup.exe を実行すると以下のダイアログが出て、Windows SDK 6.1 がインストールできます。
PHP build 環境構築
コンパイルに必要なファイルを所定のフォルダに設置していきます。
上記の場所から php-sdk-binary-tools-20110915.zip と deps-5.4-vc9-x86.7z をダウンロードします。
- "C:¥php-sdk" フォルダを作成 (*2)
-
php-sdk-binary-tools-20110915.zip を C:¥php-sdk¥ 以下に展開
- この時点で以下のフォルダ構成ができます。
-
Windows SDK を起動します。
- (スタートメニュー => 全てのプログラム => "Microsoft Windows SDK v6.1" => "CMD Shell")
- SDK のプロンプト上で以下のコマンドを実行します。
1 |
setenv /x86 /xp /release |
- 実行イメージ
- setenv 実行後、字が緑色に変わります。(*3)
- 更に続いて SDK のプロンプト上で以下のコマンドを実行します。
1 2 |
bin¥phpsdk_setvars.bat bin¥phpsdk_buildtree.bat php54dev |
- 実行イメージ
-
C:¥php-sdk¥php54dev¥vc9¥x86¥deps に deps-5.4-vc9-x86.7z の中の deps を上書きします。
-
.7z ファイルは Windows の 7-Zip(/http://www.7-zip.org/) や UNIX の p7zip(http://p7zip.sourceforge.net/) で伸長できます。
- 以下は 7-Zip で伸張(展開)する際の実行イメージ
-
.7z ファイルは Windows の 7-Zip(/http://www.7-zip.org/) や UNIX の p7zip(http://p7zip.sourceforge.net/) で伸長できます。
- C:¥php-sdk¥php54dev¥vc9¥x86¥ 以下に php 本体(php-5.4.11)のソースコードを展開します。
- この時点で以下のフォルダ構成になります。
-
ext/calendar/jewish.c の C言語リテラル内の文字をエスケープします。 (@moriyoshi さんアドバイス有り難うございます。)
- ユダヤ歴の処理コードにヘブライ語が含まれていて、日本語環境の Visual Studio だと日本語として読もうとしてコンパイルに失敗します。
- 例えば、PHP を使って以下のようにエスケープ変換する事で対応できます。実は手抜きですが、今回は ISO8859-8 のヘブライ文字が MSB の立っている領域にあって、CP932 の判定ルーチンに入るのが問題なので、これで誤摩化せます。
1 2 3 4 5 6 7 |
<?php $fp = fopen($argv[1], "rb"); while (feof($fp) === false) { $c = fgetc($fp); $code = ord($c); echo ($code & 0x80)?'\x'.dechex($code):$c; } |
変換後の jewish.c を C:¥php-sdk¥php54dev¥vc9¥x86¥php-5.4.11¥ext¥calendar¥jewish.c に上書きします。
以上で、build 環境の構築は終わりです。
PHP build
SDK のコマンドプロンプトを開いて、以下のコマンドを実行します。
1 2 3 4 5 6 7 |
setenv /x86 /xp /release cd C:¥php-sdk bin¥phpsdk_setvars.bat cd C:¥php-sdk¥php54dev¥vc9¥x86¥php-5.4.11 buildconf configure.bat nmake |
- 実行イメージ (configure.bat の後)
これで、C:¥php-sdk¥php54dev¥vc9¥x86¥php-5.4.11¥Release_TS 以下に php.exe や他必要な dll ファイルが生成されます。
PHP rebuild
ここから更にソースコードを改造して build し直したい場合は、
1 2 |
nmake clean nmake |
とします。
もし、PHP extension を独自に追加したり、その中の config.w32 を改造した場合は、buildconf からやり直します。
1 2 3 4 |
nmake clean buildconf configure.bat nmake |
nmake だけでも差分のあるファイルをコンパイルし直すはずですが、差分が反映されない事があったので、自分は念の為 nmake clean で生成ファイルを全削除してやり直す事にしてます。
PHP 実行
今回は、C:¥php¥ にまとめる事にします。(php を別のフォルダ名に読み替えて作業しても大丈夫です)
-
C:¥php-sdk¥php54dev¥vc9¥x86¥php-5.4.11¥php.ini-development を php.ini に名前を変えて C:¥php¥ にコピーします。
- php.ini の extension_dir のコメント行を有効にして下さい。
1 2 |
; On windows: extension_dir = "ext" |
- C:¥php-sdk¥php54dev¥vc9¥x86¥php-5.4.11¥Release_TS¥ 以下の php.exe と php5ts.dll を C:¥php¥ にコピーします。
- 実行イメージ
応用例1 (PHPOpenGL) +
3D の画像を生成するのに OpenGL を使いたいけど C 言語でコードを組んで毎回コンパイルするのが面倒です。
sourceforge.net の PHPOpenGL を使うと PHP から OpenGL の関数を呼べるので組み込んでみます。(PHPOpenGL を勧めてくれてありがとう > @sotarok)
- OpenGL
- php_opengl
但し、こちらは PHP4 用 extension の為、PHP5 でも動く方を使います。
- yoya / phpopengl Tags
v0.0.4 の Source code を zip でダウンロードします。
- zip ファイル中の php_opengl フォルダ内にある opengl と glut フォルダを C:¥php-sdk¥php54dev¥vc9¥x86¥php-5.4.11¥ext¥ 以下にコピーします。
- zip ファイル内の samples フォルダを C:¥php¥ 以下にコピーします。
- ↓ここにコピー。
-
GLUT のライブラリをインストール
- GLUT for Win32 から glut-3.7.6-bin.zip をダウンロード
- glut-3.7.6-bin.zip 内の glut.h と glut.lib, glut.dll を各々以下の場所に設置
1 2 3 |
C:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥include¥GL¥glut.h C:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥lib¥glut.lib C:¥Windows¥system¥glut.dll |
- build
1 2 3 4 |
nmake clean buildconf configure nmake |
- Release_TS に生成されている php_opengl.dll と php_glut.dll を C:¥php¥ext¥ にコピー。ext フォルダが無ければ作ります。
- php.ini に以下の行を追記
1 2 |
extension=php_opengl.dll extension=php_glut.dll |
- samples¥contrib¥rings.php の実行スクリーンショット
- samples¥contrib¥movelight.php の実行スクリーンショット
- PHPOpenGL は MacOSX でも動作するので、端末を選ばず使えて助かります。
- GLUT でタイマーやキーボード、マウスといったイベントを捕捉できます。3D 以外にも夢が広がる拡張です。
応用例2 (PHPOpenAL) +
PHP で音を出したい。けれど標準に音出力の機能がないので、OpenAL を PHP extension で繋げてみます。
- OpenAL
- pecl OpenAL Bindings
但し、これは Unix 用ですので、Windows でも動く方を利用します。
- yoya / phpopenal Tags
v0.3.0y2 の Source code を zip でダウンロードします。
- zip ファイル中の ext フォルダ内にある openal フォルダを C:¥php-sdk¥php54dev¥vc9¥x86¥php-5.4.11¥ext¥ 以下にコピーします。
zip ファイル内の samples フォルダを C:¥php¥ にコピーします。この時点で C:¥php¥samples¥ が存在すれば上書きコピーします。
- OpenAL 開発環境のインストール方法です。
-
OpenAL Downloads から OpenAL11CoreSDK.zip と freealut-1.1.0-bin.zip (こちらはALUT内にあります)を取得します。
- http://connect.creativelabs.com/openal/Downloads/Forms/AllItems.aspx
- OpenAL11CoreSDK.zip を伸張すると出てくる OpenAL11CoreSDK.exe で OpenAL SDK をインストールします。
- C:¥Program Files¥OpenAL 1.1 SDK¥libs¥Win32¥OpenAL32.lib と freealut-1.1.0-bin.zip 内の lib¥alut.lib 、freealut-1.1.0-bin.zip 内の include¥AL、 lib¥alut.dll を以下の場所に設置
1 2 3 4 |
C:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥lib¥OpenAL32.lib C:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥lib¥alut.lib C:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥include¥AL C:¥Windows¥system¥alut.dll |
- build
1 2 3 4 |
nmake clean buildconf configure.bat nmake |
- Release_TS に生成されている php_openal.dll を C:¥php¥ext¥ にコピー。
- php.ini に以下の行を追記
1 |
extension=php_openal.dll |
- 例えば以下のようなコードで時報のラの音(440Hzの正弦波)を鳴らせます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php // 正弦波のデータ生成 $freq = 8000; // [Hz] 電話品質 $toneA = 440; // [Hz] 時報のラの音 $period = 3; // [sec] $amp = 60; // 最大音量 127 $data = ''; $theta = 2 * M_PI * $toneA / $freq; for ($i = 0 ; $i < $freq * $period ; $i++) { $value = sin($theta * $i) * $amp + 127; $data .= chr($value); } // 音声出力の準備 $dev = openal_device_open(); $con = openal_context_create($dev); openal_context_current($con); // 音声データのセット $buff = openal_buffer_create(); openal_buffer_data($buff, AL_FORMAT_MONO8, $data, $freq); $src = openal_source_create(); openal_source_set($src, AL_BUFFER, $buff); // 音を鳴らす openal_source_play($src); sleep($period + 1); // 後始末 openal_context_destroy($con); openal_device_close($dev); |
- 以上のPHPプログラムを実行するとPCで音が鳴ります。
- 渡すバッファのデータを変える事で任意の音を鳴らせるようになります。
-
PHPOpenAL の注意点
- OpenAL の Runtime が入っていないと音が鳴りません。(build した PC 以外で動かそうとするとよく引っかかる罠です)
- OpenAL Downloads の OpenAL11CoreSDK.zip(build する場合はこっち) 又は oalinst.zip (Runtime のみ) をインストールして下さい。
トラブルシューティング諸々
-
configure.bat で bison is required のエラーが出る
- おそらく phpsdk_setvars.bat の実行を忘れてます。僕はよく忘れます。。
1 2 |
Checking for bison.exe ... <not found> ERROR: bison is required |
-
ext/calendar/jewish.c でコンパイルが止まる
- エスケープ変換を忘れてませんか。もし変換しているとすれば何か間違えているのでやり直します。
1 2 3 4 5 |
ext\calendar\jewish.c : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 ext\calendar\jewish.c(324) : error C2001: 定数が 2 行目に続いています。 ext\calendar\jewish.c(325) : error C2001: 定数が 2 行目に続いています。 ext\calendar\jewish.c(326) : error C2001: 定数が 2 行目に続いています。 ext\calendar\jewish.c(327) : error C2001: 定数が 2 行目に続いています。 |
-
unresolved externals のエラーでコンパイルが止まる。
- setenv を忘れています。setenv で文字の色が変わるので、さすがにこれで間違える事は無いと思いますが。。
1 |
x64\Release_TS\php5ts.lib : fatal error LNK1120: 1601 unresolved externals |
-
P1 P2 Version 不一致エラーでコンパイルが止まる。
- SP1 のつかない Visual Studio と Windows SDK 6.1 の組み合わせだと、このエラーが出ます。SP1 がインストールされているか確認しましょう。
1 |
fatal error C1900: 'P1' Version '20080116' と 'P2' Version '20070207' が一致しません。 |
参考URL
- Build your own PHP on Windows
- Windows で PHP を build する
- PHPソース中のヘブライ語
最後に
そんな訳で "僕の PHP " は 3D がグリグリ動いたり音が鳴ったりします。
途中でさらりと流しましたが、古い PHP extension の PHP5 対応や Windows 対応もコツが分かれば簡単です。興味のある方がいれば記事の続きが出るかもしれません。
以上、Windows での build も環境が整えばコマンドを幾つか打つだけですので、是非 PHP を拡張してお楽しみ下さい。
*1: PHP の build には沢山の LIB ファイルが必要で、32bit 版は公式サイトで配布されていますが、64bit 版 LIB は無いので自前で作る必要があり少し手間がかかります。
*2: フォルダ名を読み替えれば、php-sdk 以外の場所でも同様に作業出来ます。
*3: 読みにくい場合は color コマンドで変更すると良いです。color A 又は color B を実行すると字が読み易くなってお勧めです