Windows で PHP を build する

本日は PHP Advent Calendar 2011 の25日目です。前日は [twitter:@Hiraku]さんの「PHPとgoto文」でした。今更 goto?と思われる方でも読めば目から鱗が落ちる良記事です。

さて近年、MacOSX 派が幅を利かせてきているようですが、Windows OS を利用している方も大勢います。Windows での PHP build は今でも有益だと考え、この記事を作成しました。

はじめに

PHPソースコードから WindowsPHP 実行ファイルを build するのは意外と簡単です。その手順を軽く(?)紹介したいと思います。
更に標準でない PHP extension を加えて build し、それらの機能(OpenGL/OpenAL)を動かす例も示します。

尚、32bit PC の Windows Vista と 7 で PHP 5.3.8 を build して動作を確認しました。

build 環境構築


  • Windows SDK のプロンプトを起動する (スタートメニューから Microsoft Windos SDK v7.1 を辿ります)
    • 以下のコマンドを実行
 cd C:\php-sdk
 setenv /x86 /xp /release
 bin\phpsdk_setvars.bat
 bin\phpsdk_buildtree.bat php53dev
      • (setenv 実行後に文字が暗い緑色に変わります。読み難いです)




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 実行手順

  • Windows SDK プロンプトを起動して以下のコマンドを実行
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
  • C:\php-sdk\php53dev\vc9\x86\php-5.3.8\Release_TS フォルダが生成され、その下に exe や dll が出来ます。

二回目以降の build 手順

  • Windows SDK プロンプト起動する度に、以下のコマンドを実行
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 も一緒に

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\
cd C:\php-sdk\php53dev\vc9\x86\php-5.3.8
nmake clean
buildconf
configure
nmake
  • Release_TS 以下に出来る php_opengl.dll php_glut.dll を "C:\TEMP\phpwin" にコピー
  • 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 も一緒に

//Microsoft Visual Studio 9.0

    • 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
  • Release_TS 以下に出来る php_openal.dll を "C:\TEMP\phpwin" にコピー
  • php.ini の extension 定義が並ぶ場所に以下の行を追記
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定位オーディオも表現出来るそうです。

まとめ

  • PHPWindows で build するのに、少しソースコードを編集する必要がありました。
  • 一度、環境を整えてしまえば、コマンドラインだけで build 出来ます。とても楽です。
  • そんな訳で、"僕の PHP" はウィンドウを開いて描画したり、マウスやキーボードのイベントをハンドリングしたり、音声をスピーカー出力出来たりします。

今後の課題

  • Windows でのデバッグノウハウを探求中。
  • PHPOpenGL の glutTimerFunc が不安定なのでデバッグ中。
  • PHPOpenAL を MacOSX でも動かす (でも、OpenSL に浮気しようか迷い中)
  • 今回はヘブライ語を諦めたのですが、出来れば対応したいです。

最後に

この記事が PHP Advent 2011 のラストだと思っていたら、[twitter:@super_rti] さんが12/26 にエントリされていました。真のラストは HipHop for PHP ネタだそうです。期待して待ちましょう!

追記

ディレクトリに vc9 と出てきて、このままでも build は出来ますが、当記事では Visual Studio 2010 を使っているので、全て vc10 と読み替えて下さい。vc9 は Visual 2008 に相当します。

追記2 (2014/05/19)

SDK インストールで失敗する時は、こちら参照。