Windows で PHP を build する
本日は PHP Advent Calendar 2011 の25日目です。前日は [twitter:@Hiraku]さんの「PHPとgoto文」でした。今更 goto?と思われる方でも読めば目から鱗が落ちる良記事です。
さて近年、MacOSX 派が幅を利かせてきているようですが、Windows OS を利用している方も大勢います。Windows での PHP build は今でも有益だと考え、この記事を作成しました。
はじめに
PHP のソースコードから Windows の PHP 実行ファイルを build するのは意外と簡単です。その手順を軽く(?)紹介したいと思います。
更に標準でない PHP extension を加えて build し、それらの機能(OpenGL/OpenAL)を動かす例も示します。
尚、32bit PC の Windows Vista と 7 で PHP 5.3.8 を build して動作を確認しました。
参考にした URL
build 環境構築
cd C:\php-sdk setenv /x86 /xp /release bin\phpsdk_setvars.bat bin\phpsdk_buildtree.bat php53dev
-
-
- (setenv 実行後に文字が暗い緑色に変わります。読み難いです)
-
- deps-5.3-vc9-x86.7z を展開 (展開ソフトは 7-Zip がお勧めです)
- http://windows.php.net/downloads/php-sdk/
- 展開して出来る deps フォルダを "C:\php-sdk\php53dev\vc9\x86\deps" に上書き
- php-5.3.8.tar.gz を展開
- http://php.net/downloads.php
- "C:\php-sdk\php53dev\vc9\x86" 以下に php-5.3.8 フォルダを展開
char *JewishMonthHebName[14] = { "", "uuoe", "cuai", "enia", "eau", "uae", "aao", "aaoa", "oeni", "aeeo", "neai", "uiae", "aa", "aiai" };
-
-
- (似たアルファベットに入れ替えて誤摩化しました)
- ext\gd\config.w32 を編集 (SHARED が考慮されていないので、その対応です)
-
if (!PHP_ZLIB_SHARED) { ADD_DEF_FILE("ext\\zlib\\php_zlib.def"); }
build 実行手順
setenv /x86 /xp /release cd C:\php-sdk bin\phpsdk_setvars.bat cd C:\php-sdk\php53dev\vc9\x86\php-5.3.8 buildconf configure nmake
二回目以降の build 手順
setenv /x86 /xp /release cd C:\php-sdk bin\phpsdk_setvars.bat
- プログラムを編集して build し直す時には、以下のコマンドを実行。(何故か、nmake clean しないと編集分が反映されませんでした)
cd C:\php-sdk\php53dev\vc9\x86\php-5.3.8 nmake clean nmake
- config.w32 まで書き換えた場合は、buildconf もやり直し。
cd C:\php-sdk\php53dev\vc9\x86\php-5.3.8 nmake clean buildconf configure nmake
動作ファイル一式
- 動かす場所を決める。今回は "C:\TEMP\phpwin" とする
- C:\php-sdk\php53dev\vc9\x86\php-5.3.8\php.ini-development を php.ini に名前を変えて "C:\TEMP\phpwin" にコピー
- Release_TS 以下に出来る php.exe, php5ts.dll, php_gd2.dll を "C:\TEMP\phpwin" にコピー
cd C:\TEMP\phpwin php -r "var_dump(1);"
OpenGL extension も一緒に
- OpenGL は、様々なプラットフォームで動作する 3D レンダリングエンジンです。
- http://www.opengl.org/
- OpenGL の機能をまとめたラッパーやイベントハンドリング機構を持つ GLUT と併せて使うと便利です。
- sourceforge.net プロジェクトの PHPOpenGL は PHP4 用の為、PHP5 でも使えるように改造して github で公開しました。(基本的な不具合も幾つか治しています)
- glut-3.7.6-bin.zip (GLUT for Win32)を開発環境にインストール。
- http://user.xmission.com/~nate/glut.html
- glut.h と glut.lib を各々以下の場所に設置
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\GL C:\Program Files\Microsoft Visual Studio 10.0\VC\lib
-
- glut.dll を以下の場所に設置
C:\Windows\system\
- PHPOpenGL の php_opengl 以下にある opengl と glut フォルダを C:\php-sdk\php53dev\vc9\x86\php-5.3.8\ext 以下にコピー。
- Windows SDK プロンプトで以下のコマンドを実行
cd C:\php-sdk\php53dev\vc9\x86\php-5.3.8 nmake clean buildconf configure nmake
- php.ini の extension 定義が並ぶ場所に以下の2行を追記
extension=php_opengl.dll extension=php_glut.dll
- PHP サンプルプログラム (ウィンドウを開いて線を引く)
<?php // ウィンドウ表示時に呼ばれる function display() { glClear(GL_COLOR_BUFFER_BIT); // 背景を初期化 glColor3f(0.0, 0.0, 0.0); // 黒ペン glBegin(GL_LINES); glVertex2f(10, 10); glVertex2f(100, 100); glEnd(); glFlush(); // 命令の実行 } $width = 320; $height = 240; glutInit($argv); // お約束 glutInitWindowSize($width, $height); glutInitDisplayMode(GLUT_RGB); // RGB 24bit color glutCreateWindow('Line Drawing'); glutDisplayFunc('display'); // コールバックの登録 glClearColor(1.0, 1.0, 1.0, 1.0); // 背景を白地に gluOrtho2D(0.0, $width, $height, 0.0); // Y軸の上下を反転 glutMainLoop();
OpenAL extension も一緒に
- OpenAL は様々なプラットフォームに対応した音声再生のライブラリです。
- pecl で公開されている OpenAL Bindings を Windows でも動くようにしました。(config.w32 を作っただけです)
- http://pecl.php.net/package/openal
- Windows 対応版 => https://github.com/yoya/phpopenal
- OpenAL11CoreSDK.zip と freealut-1.1.0-bin.zip を取得
- http://connect.creativelabs.com/openal/Downloads/Forms/AllItems.aspx
- OpenALCoreSDK をインストール
- C:\Program Files\OpenAL 1.1 SDK\libs\Win32\OpenAL32.lib を C:\Program Files\Microsoft Visual Studio 10.0\VC\lib にコピー
//Microsoft Visual Studio 9.0
-
-
- C:\Program Files\OpenAL 1.1 SDK\include 以下のファイルを C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ にコピー
- freealut-1.1.0-bin.zip を展開して、include\AL と lib\alut.lib を各々以下の場所にコピー
-
C:\Program Files\Microsoft Visual Studio 10.0\VC\include C:\Program Files\Microsoft Visual Studio 10.0\VC\lib
-
- lib\alut.dll を以下の場所に設置
C:\Windows\system\
- PHPOpenAL の ext 以下にある openal フォルダを C:\php-sdk\php53dev\vc9\x86\php-5.3.8\ext 以下にコピー。
- Windows SDK プロンプトで以下のコマンドを実行
cd C:\php-sdk\php53dev\vc9\x86\php-5.3.8 nmake clean buildconf configure nmake
extension=php_openal.dll
- PHP サンプルプログラム (正弦波の音をスピーカー出力)
<?php // 正弦波のデータ生成 $freq = 8000; // [Hz] 電話音質 $tone = 440; // [Hz] 時報のラの音 $period = 3; // [sec] $volume = 127; // 最大音量 $data = ''; $theta = 2 * M_PI * $tone / $freq for ($i = 0 ; $i < $freq * $period ; $i++) { $value = sin($theta * $i) * $volume + 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);
- 実行すると、ラ(440Hz)の音が3秒間鳴ります。
- 今回のサンプルでは利用していませんが、音源と視聴者の位置を 3D で設定する API があり、3D定位オーディオも表現出来るそうです。
まとめ
今後の課題
最後に
この記事が PHP Advent 2011 のラストだと思っていたら、[twitter:@super_rti] さんが12/26 にエントリされていました。真のラストは HipHop for PHP ネタだそうです。期待して待ちましょう!
追記
ディレクトリに vc9 と出てきて、このままでも build は出来ますが、当記事では Visual Studio 2010 を使っているので、全て vc10 と読み替えて下さい。vc9 は Visual 2008 に相当します。