Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2006/11/19

counter hits
since 1999/11/06


Visual C++ Express Editionを使ってPHPをbuildする

何を突然思い立ったか、Visual C++ Express EditionでPHPをbuildできるかどうか試してみたいという衝動に駆られ、試行錯誤しながらやってみた結果をまとめました。

もうずいぶん前になってしまいますが、2005/12/15に無償のVisual C++としてExpress EditionがMicrosoftからりリースされました。まあ、リリースされたときから「同じVCならPHPをbuildできるんじゃないか」と漠然と思っていたのですが、なかなか重い腰が上がらず。。。(^^; で、最近ふと思い立って色々ハマり、ようやくまとめられる状態になました。

基本的な手順はPHPマニュアルの「新しいビルドシステムを使用して PHP をビルドする [PHP >=5 のみ]」にあるとおりですが、Express Editionだとちょっと違ったりしています。

1.今回の環境

今回インストールを行った環境です。今回は、PHP本体とサードパーティー製PHP拡張であるeAcceleratorをbuildしてみました。

  • Windows 2000 Professional+SP4
  • Visual C++ 2005 Express Edition
  • Microsoft Platform SDK for Windows Server 2003 R2
  • Apache2.0.59/2.2.3
  • PHP5.1.6/PHP5.2.0
  • eAccelerator0.9.5

2.VC++ Express EditionとPlatform SDKのインストール

最初に言っておきますが、この工程がむちゃくちゃ時間がかかりました。今回は両者ともisoファイル(CDイメージ)をダウンロードし、CD-Rに焼いてインストールしました。ダウンロードするURLは、それぞれ以下の通りです。

CD-Rに焼いたら、インストールを行います。基本的にすべてインストールする方が無難と思います。今回はインストール先を

  • D:\Program Files

としましたので、それぞれのインストールディレクトリは

  • D:\Program Files\Microsoft Visual Studio 8
  • D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2

となっています。

3.Apacheのインストール

PHPと連携させるために、インストールしておきます。今回は2.0.59と2.2.3のmsi版をダウンロード・インストールしました。インストールディレクトリは2.0.59、2.2.3それぞれ

  • D:\Program Files\Apache Group
  • D:\Program Files\Apache Software Foundation

です。

4.作業用ディレクトリの作成

今回は

  • D:\work\dev

として用意しました。

5.win32build.zipとbindlib_w32.zipの取得

PHPマニュアルにもあるように、Windowsでのbuildにはwin32build.zipとbindlib_w32.zipが必要になります。PHPマニュアルのリンク先からダウンロードし、作業用ディレクトリ下に展開します。ただし、bindlib_w32.zipは親ディレクトリが作成されないので、

  • D:\work\dev\bindlib_w32

を作成し、そこに展開しました。

6.PHPソースの取得と展開

当然ですが、PHPのソースもダウンロード・展開しておきます。今回は5.1.65.2.0のtar.gz版をダウンロードし、作業ディレクトリ下に展開しました。展開先ディレクトリはそれぞれ

  • D:\work\dev\php-5.1.6
  • D:\work\dev\php-5.2.0

となります。

この時点で、D:\work\devディレクトリ下は次のようになっているはずです。

D:\work\devディレクトリ

7.resolv.lib のビルド

PHPマニュアルにあるように、resolv.libをbuildします。まずは、マニュアルの指示通り、bindlib_w32\bindlib.dswファイルをダブルクリックします。すると、

Visual C++プロジェクト

とダイアログが表示されるので、「すべてはい」ボタンを押下します。

次に、メニューの[ツール]-[オプション]を選択し、インクルードファイルの参照先を追加します。追加するディレクトリは、

  • D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include

です。

オプション

続けて、Release版をbuildするよう、ツールバーのプルダウンを変更します。

Visual C++

そして、メニューの[ビルド]-[ソリューションのビルド]を選択し、buildを実行します。

Visual C++

実行する直前に、変更を保存するためのダイアログが表示されるので、適宜保存しておきます。

保存のダイアログ

buildが完了すると、直下のReleaseディレクトリにresolv.libファイルが作成されているはずです。

D:\work\dev\bindlib_w32\Releaseディレクトリ

これをPHPマニュアルのとおり、win32build\libディレクトリにある同名のファイルに上書きコピーします。今回は、念のためバックアップを取りました。

D:\work\dev\win32build\libディレクトリ

8.まずはApache2.0との連係

それでは早速Apache2.0との連係を行うPHPをbuildしてみましょう。まずは必要なインクルードファイルとライブラリをwin32buildディレクトリ以下にコピーします。Apache2の場合、win32buildディレクトリ直下にapache2ディレクトリを作成し、その下にApache2のインストールディレクトリ下にあるinclude・libの各ディレクトリをディレクトリごとコピーします。

D:\work\dev\win32build\apache2ディレクトリ

ここでコマンドプロンプトを開き、phpのソースディレクトリに移動し、次のコマンド群を実行します。

>"D:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"
>"D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\SetEnv.Cmd"
>set path=%path%;D:\work\dev\win32build\bin
>set include=%include%;D:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\mfc
>buildconf.bat
>cscript /nologo configure.js --enable-apache2handler --without-libxml --without-xml
    --enable-zend-multibyte --disable-calendar --disable-odbc --without-pdo-odbc
>nmake

最初の4行はbuildするための各種環境変数の設定です。buildconf.batはUNIX・Linux環境でのautoconfに相当し、configureスクリプト(正確にはconfigure.js)を生成します。次の行がconfigureスクリプトの実行です。オプションは改行していますが、実際は一行です。今回は、XML系・カレンダー・ODBC系を無効にしています。理由は、それらをbuildするためのヘッダファイルやライブラリがないためです。最後のnmakeコマンドでコンパイルを実行します。

また、他のconfigureオプションは、--helpを付けてconfigure.jsを実行すると一覧が表示されます。参考までに、PHP5.1.6の場合はこんな感じです。

無事コンパイルが終了すると、最後に

             :
>SAPI sapi\cli build complete

>

と表示されます。また、直下のRelease_TSディレクトリにdllが生成されているはずです。dllが生成されていれば、httpd.confを書き換えてphpinfoを表示してみましょう。

●httpd.confへの追加分
LoadModule php5_module "D:/work/dev/php-5.1.6/Release_TS/php5apache2.dll"
PHPIniDir "D:/work/dev/php-5.1.6/Release_TS/"
AddType application/x-httpd-php .php

今回は、同じ手順でPHP5.1.6・5.2.0共にbuild・phpinfoの表示ともうまくいきました。

9.楽に多くの拡張をbuildする

先ほどはconfigureオプションをほとんど付けませんでしたが、理由はヘッダファイルやライブラリがないためbuildするからです。といっても、一からかき集めてくるのも何なので、ある程度のライブラリが集まったwin32buildがあれば便利ですねぇ。

ということで、たまたま見つけました :-)

というか、上のエントリその次のエントリを見て、やる気が出てきたというか。。。上のコメント欄に書かれているzip.zipがそれです。コメントを書いているPierreさんって、PHP本家のコア開発者の方と思います。

では、早速取得して展開します。。。が、このファイル、44.4MBもありますので展開にかなり時間がかかります。展開する場合、D:\work直下に展開してください。理由は。。。このzipファイル、devディレクトリを作成し、その下にwin32buildに相当するphp_buildディレクトリを作成するためです。

ということで、展開した直後は次のようなディレクトリ構成になっているはずです。

D:\work\devディレクトリ

展開後、resolv.libファイルをphp_build\libにコピーするのをお忘れなく。

では、zip.zipを使ってbuildしてみましょう。先ほどのコマンドプロンプトが開いたままであれば、一度コンパイルしたファイルを削除し、再度buildconf.batを実行します。こうすることで、win32buildではなく、php_buildディレクトリ側を見てくれるようになります。

>nmake clean
>buildconf.bat

さて、configureオプションですが、ここでは可能な限りすべてのオプションを有効にする「--enable-snapshot-build」を使います。これは、PHP本家で配布されているWin32版バイナリでも使われているオプションです。なお、カレンダーとODBCは無効にしたままです。なお、オプションは改行していますが、実際は一行です。また、「--enable-snapshot-build」には「--enable-zend-multibyte」は含まれません。別途指定が必要です。

>cscript /nologo configure.js --enable-snapshot-build --with-gd=shared
    --enable-zend-multibyte --disable-calendar --disable-odbc
    --without-pdo-odbc
>nmake

で、コンパイルですが、今度はターゲットとして「snap」を指定してnmakeを実行します。

>nmake snap

無事コンパイルが終了すると、直下のRelease_TS\php-5.x.xディレクトリ(x.xはバージョンによって変わる)に配布用のファイル群が生成されているはずです。こちらでも、httpd.confを書き換えてphpinfoを表示してみましょう。今回は「--enable-snapshot-build」を指定しているため、PHP5.2.0ではApache2Filter版やApache2.2用のdllも作成されます。

●httpd.confへの追加分(Apache2Filter版の場合)
LoadModule php5_module "D:/work/dev/php-5.2.0/Release_TS/php-5.2.0/php5apache2_2_filter.dll"
AddOutputFilter PHP .php
●httpd.confへの追加分(Apache2.2Handler版の場合)
LoadModule php5_module "D:/work/dev/php-5.2.0/Release_TS/php-5.2.0/php5apache2_2.dll"
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

今回も同じ手順でPHP5.1.6・5.2.0共にApache2Handler版・Apache2Filter版のbuild・phpinfoの表示ともうまくいきました。。。が、残念ながら両方ともmbstringはbuildに失敗してしまいました。この辺は、もうちょっと突っ込みたいなぁ。

10.ついでにeAcceleratorでもbuildしてみる

言わずと知れたeAcceleratorですが、build手順としては「phpizeがなかった頃の拡張モジュールのインストール手順」みたいな感じで、PHPのソースツリーのextディレクトリ直下にeAcceleratorのソースを展開し、buildconf.bat・configure・nmakeする、といった具合です。ただし、展開したときのディレクトリ名を「eaccelerator-0.9.5」から「eaccelerator」に変更しておく必要があります。nmake時に「-」が引っかかってエラーになります。

eacceleratorディレクトリ

また、configureオプションに「--enable-snapshot-build」を指定している場合、eAcceleratorを有効にするためには「--disable-eloader」を指定します。「--enable-eaccelerator」は「--enable-snapshot-build」を付けると自動的に有効になりますが、「--enable-eloader」と同時に指定することができないためです。

ちなみ、PHP5.1.6の場合のconfigureオプションはこんな感じになります。

PHPをbuildした環境が残っている(nmake cleanしていない)場合の手順をまとめると以下のようになります。残っていない場合、nmake snapとします。なお、configureオプションは改行していますが、実際は一行です

>buildconf.bat
>cscript /nologo configure.js --enable-snapshot-build --with-gd=shared
    --enable-zend-multibyte --disable-calendar --disable-odbc
    --without-pdo-odbc
    --disable-eloader
>nmake php_eaccelerator.dll
            :
EXT eaccelerator build complete

>

buildが終わったら、Release_TSディレクトリに作成されたphp_eaccelerator.dllをRelease_TS\php-5.x.x\extディレクトリにコピーし、php.iniに以下のような設定を追加します。

short_open_tag = On
extension_dir = "D:/work/dev/php-5.x.x/Release_TS/php-5.x.x/ext/"
extension=php_eaccelerator.dll
eaccelerator.allowed_admin_path = "/"
>

そして、eAcceleratorのソースツリーにあるcontrol.phpをブラウザからアクセスするディレクトリにコピーして、ブラウザからアクセスしてみましょう。BASIC認証のユーザーID・パスワードは、control.phpに記載されています。

eaccelerator

折角なので、buildしたeAcceleratorのdllを置いておきます。当然、無保証です ;-)。

11.とりあえずのまとめ

Visual C++ 2005 Express Editionを使ったbuildをやってみましたが、コマンドプロンプトの使い勝手は別として、Linux環境と極端な違いはないように思います。「配布されてるバイナリを使えば良いじゃん」というのはそうなんですが、パッチ当てたバージョンを使いたいとか、バイナリで配布されていないPHP拡張を使いたいとか、自分で拡張作ったんでWin32版も配布したいとか、まあ、知ってて損はないかなぁ、と思います。

ちなみに、今回初めてVC++使いました ;-) どうも、この手のツールは使い方覚えるのが億劫なので。。。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2006 by Hideyuki SHIMOOKA all rights reserved.