IIS 7.0 で PHP を実行できるようにする

SERVER


PHP on IIS

Microsoft 社は PHP on IIS と銘打って、IIS 上で PHP の利用を推進している様子です。

Linux 系で有名な LAMP (Linux / Apache / MySQL / PHP) に対抗して WIMP (Windows / IIS / MySQL / PHP) 呼んでいるようですが、言葉はどうでもいいとして、Windows 上で PHP が動作するのは魅力に感じます。

というのも、個人的な主観ではありますけれど、Windows は環境や仕組みに統一感があって、開発ツールも利用しやすいように感じます。それになにより、Linux 系は依存関係や相性等の問題で、上手く行かない事が多いような気がします。

全てを Windows 系でまかなえたら開発効率も上がると思いますけど、通常は Linux 系の方が一般的ですから、なかなかそうは行かないものです。それでも、Windows で PHP + MySQL という選択肢を選ぶことが出来るなら、少なくとも ASP と同じ感覚でサイト開発を行うことができるだけでも、負担は幾分軽減できるような気もします。

主観ばかりを並べましたが、ともあれ IIS 7.0 上で PHP を動作させることが出来るとのことなので、さっそく、それを行ってみることにしました。併せて Perl による CGI を実行できるようにする環境も作っておくことにします。

 

IIS の環境準備

CGI においても PHP においても、IIS 7.0 にて CGI の役割を有効にしておく必要があるようです。

 

まず、IIS で CGI を使用できる状態にする必要があります。

IIS 7.0 では、管理ツールの "サーバーマネージャ" の 【役割】 にて、有効化を行うことが可能です。

これをクリックすると、右側のウィンドウにインストールされている役割の設定画面が表示されるので、【Web サーバー (IIS)】 の項目内にある "役割サービスの追加" を選択します。

そして、"Web サーバー" → "アプリケーション開発" の中の "CGI" を有効化します。

CGI 環境のインストール

Perl による CGI 環境を IIS で利用できるようにするには、Perl インタープリターをインストールして、CGI という拡張子に対してマッピングを行う必要があります。

Perl インタープリターのインストール

Perl インタープリターをインストールします。

Windows では ActivePerl が利用できるので、こちらから、平成 21 年 10 月 02 日時点での最新版である ActivePerl 5.10 の 64 bit 版をダウンロードすることにしました。

ダウンロードは、少しわかりにくく感じましたが、"ActivePerl DOWNLOAD NOW Windows (x86)" の画像の直ぐ下にある 【Other Systems and Versions】 というリンクを辿ることで、"Windows (64-bit, x64)" 版の ActivePerl 5.10.1.1006 をダウンロードすることができました。

サーバー上で、ダウンロードした "ActivePerl-5.10.1.1006-MSWin32-x64-291086.msi" を実行し、手順通りにインストールを進めて行けば完了です。

 

ハンドラマッピングの確認

ActivePerl のインストールが完了したら、インターネットインフォメーションサービスマネージャから ハンドラマッピング の設定を確認します。

該当するサーバー名をクリックすると、"ハンドラマッピング" という項目があります。それを開くと "*.pl" というパスに割り当てられたプログラムを確認することが出来ると思います。

ただ、通例、CGI の拡張子は "*.cgi" となりますので、今回も念のためそれに合わせておくことにします。

 

既存の "*.pl" の設定を調整しても良いですし、新しい "スクリプトマッピング" として、下記の内容を登録しても大丈夫です。

要求パス *.cgi
実行可能ファイル C:\Perl64\bin\perl.exe "%s" %s
名前 ActivePerl (x64)

あとは、【要求の制限】 ボタンをクリックして、次の設定にしておきます。

マップ ファイル
動詞 GET, HEAD, POST
アクセス スクリプト

これで、Perl による CGI を動作させることが可能になります。

 

動作確認

次のような内容のファイルを "test.cgi" などとしてアップロードして、ブラウザから内容が正しく処理されて表示されることを確認します。

#!/usr/bin/perl

 

 print "Content-type: text/plain\n\n";

print "CGI Executed.";

このような CGI を実行すれば、ブラウザには次の通りのテキストが表示される感じです。

CGI Executed.

 

PHP 環境のインストール

PHP モジュールのインストール

PHP モジュールは PHP のサイト からダウンロードできるようになっています。

"downloads" のリンクを辿ると、平成 21 年 10 月 2 日現在、PHP 5.3.0 が利用できるようになっていましたので、IIS 用の "PHP 5.3 (5.3.0) VC9 x86 Thread Safe" の Installer をダウンロードしてみることにしました。

また、IIS 用の "VC9" のパッケージの場合、Microsoft Visual C++ 2008 再頒布可能パッケージ (x86 - 32bit) (x64 - 64bit) も併せてインストールする必要があるとのことでしたけど、Windows Server 2008 では必要ないかもしれません。

 

 

”php-5.3.0-Win32-VC9-x86.msi" を実行すると、PHP5 のインストーラーが起動します。

[Next] ボタンをクリックすると、"End-User License Agreement" が表示されます。同意の上 [Next] ボタンをクリックして、"Destination Folder" のところは、既定値 "C:\Program Files (x86)\PHP\" のまま [Next] ボタンをクリックします。

続いて "Web Server Setup" という画面となりますので、ここでは "IIS FastCGI" を選択して [Next] ボタンをクリックします。そして、次の "Choose Items to Install" では、必ず "Extensions" の "Multi-byte String functions" をインストールするようにします。

他のモジュールもここで選ぶことは出来ますが、ここであまり欲張ると、インストール中に"Error trying access httpd.conf file. You will need to manually configure the web server." といったメッセージが表示されてしまったり、実行時にさまざまな dll が見つからずに PHP が実行できなくなったりしてしまう様子です。

とりあえずディフォルトのモジュールに Multi-byte String function のみを追加して、これでインストールを進めると、エラーなく "Completed the PHP 5.3.0 Setup Wizard" と表示されたウィンドウが現れて、インストールはとりあえず完了となりました。

 

ハンドラマッピングの確認

インターネットインフォメーションサービスマネージャから ハンドラマッピング の設定を確認してみると、どうやら "*.php" に対するモジュールマップが登録されているようでした。

要求パス *.php
モジュール FastCgiModule
実行可能ファイル "C:\Program Files(x86)\PHP\php-cgi.exe"
名前 PHP_via_FastCGI

【要求の制限】 は、次のような感じです。

マップ ファイルまたはフォルダ
動詞 すべての動詞
アクセス スクリプト

 

PHP 設定を調整する

自分の環境では、このままの状態だと "phpinfo()" を実行したときに次のエラーが発生してしまうため、設定の微調整が必要でした。

500 - 内部サーバーエラーです。

検索中のリソースに問題が発生したため、表示することが出来ません。

このように "phpinfo()" ではエラーとなってしまいますが、何故か、簡単な print 文のようなもので試してみると、問題なく動作する様子です。

この原因について調べてみたところ、PHP をインストールしたフォルダ (C:\Program Files(x86)\PHP) にある "php.ini" を若干調整しないと行けない事がわかりました。

具体的には、"log_errors = On" となっているにも関わらず "error_log" でのログ保存場所の指定がされていないことが原因です。よって、これを解消するために、例えば次のようにします。

error_log = syslog

または、ファイルにログを取得する場合には、次のようにタイムゾーンの設定も併せてしないといけないような感じでした。

error_log = "C:\temp\php.log"

date.timezone = Asia/Tokyo

他にも、Using FastCGI to Host PHP Applications on IIS 7.0 のサイトには、次のように設定を調整する必要があるとの記載がありましたので、念のため設定しておくことにしました。

fastcgi.impersonate = 1

cgi.fix_pathinfo = 1

cgi.force_redirect = 0

open_basedir = "C:\inetpub\wwwroot"

extension_dir = "./ext"

open_basedir については、これ以下のフォルダに保存した PHP ファイルだけが実行できるようになるというものですので、必要がなければ設定しなくても大丈夫だと思います。ここで指定したフォルダー内に保存されているファイルしか require や include ができなくなるようです。

 

他にもお勧めの設定としては、開発環境であれば次の設定をすることによって、PHP スクリプトの実行時エラーをブラウザーで表示させることが可能です。

display_errors = On

display_startup_errors = On

 

このような感じに "php.ini" を修正したら、IIS を再起動すれば、PHP 周りの設定は完了です。

 

動作確認

PHP が正しく動作するかを確認するには、次のコードを記載した php ファイルを作成して、それを IIS 経由で参照します。

<?php phpinfo() ?>

これを表示することで、PHP に関する情報が記載されたページが表示されれば、動作確認は完了です。

 

ちなみにここで、次のエラーがブラウザ上に表示されてしまった場合には、モジュールが何か DLL を必要としている可能性があります。

500 - 内部サーバーエラーです。

検索中のリソースに問題が発生したため、表示することが出来ません。

サーバーの画面上にも、"CGI / FastCGI は動作を停止しました" という通知が表示されますが、DLL が不足しているかといった情報は記載されていないようです。

それを知るためには PHP をインストールしたフォルダ (C:\Program Files(x86)\PHP) 内の "php-cgi.exe" をダブルクリックすることで、エラーの原因が何であるかを確認することが可能です。

libglib-2.0-0.dll が見つからなかったため、このアプリケーションを解しできませんでした。アプリケーションをインストールしなおすとこの問題は解決される場合があります。

このような形でエラーメッセージが表示されるので、該当する DLL を何らかの形で入手して、PHP をインストールしたフォルダなどへ配置すれば、その DLL を検出させることができる感じでした。

それにしても、上記のような Windows 用 DLL をダウンロードするサイトが幾つもあるんですね。ずいぶんとにぎわっているような感じが伺えますけど、どこかしら時代を逆行しているような、なかなかそれが嬉しいとも思い難い光景でした。