親方、空から覚え書きが!でタグ「Apache HTTP Server」が付けられているもの

PHP のバージョン毎のチェックを楽に

Apache HTTP Server の Windows 版には、Apache Service Monitor という、タスクバーから Apache を制御できる便利なユーティリティが備わっています。このユーティリティは、Windows サービスに登録された Apache のサービスを制御するものです。これを利用して、バージョンの異なる PHP を切り替えて実行できる環境を整えてみるお話です。

Apache Service Monitor のウィンドウ

手順

  1. PHP のインストール
  2. PHP の設定
  3. Apache 2.2 のインストール
  4. Apache 2.2 の設定
  5. Windows サービスへの登録
  6. Windows サービスの補足
PHP のインストール

PHPPHP: Downloads から、適当なバージョンをダウンロードします。Windows Binaries 版を使うと、手抜きができて最高です。自分は次の図のように C:\PHP へバージョン別にぶち込んでいます。

PHP のインストール パス

PHP の設定

それぞれインストールした場所の php.ini を適当に変更します。

; 拡張が必要ならば…
extension_dir = "C:\PHP\5.2.3\ext"
extension=php_mbstring.dll
extension=php_pdo.dll

同じバージョンで複数の php.ini を使い分けたい場合は、後述の Apache 2.2 の設定 にて指定する事が可能です

Apache 2.2 のインストール

Apache HTTP Server Projectダウンロード ページ から、適当なバージョンをダウンロードします。Win32 Binary (MSI Installer) 版を使うと、手抜きができて最高です。

この後の手順では、Apache HTTP Server をインストールしたパスを C:\Program Files\Apache Software Foundation\Apache2.2 として進めます。

Apache 2.2 の設定

C:\Program Files\Apache Software Foundation\Apache2.2\conf\http.conf を開き、次の2行を末尾に追加します。

# PHP configuration
Include conf/extra/php.conf

C:\Program Files\Apache Software Foundation\Apache2.2\conf\extra\php.conf を作成し、次のルールで記述します。

<IfDefine パラメータ名>
    ディレクティブ
</IfDefine>

パラメータ名 は適当な名前で ok です。IfDefine ディレクティブは、Apache が起動された時に、指定したパラメータ名が定義されていれば内包するディレクティブを有効にします。 ディレクティブ には、PHP モジュールに関する設定を記述します。以下に一例を上げます。

# latest version on major 5
<IfDefine PHP5>
    LoadFile "C:\PHP\5.2.3\php5ts.dll"
    LoadModule php5_module "C:\PHP\5.2.3\php5apache2_2_filter.dll"
    AddInputFilter PHP php
    AddOutputFilter PHP php
    PHPINIDir "C:\PHP\5.2.3"
</IfDefine>

# latest version on major 4
<IfDefine PHP4>
    LoadFile "C:\PHP\4.4.7\php4ts.dll"
    LoadModule php4_module "C:\PHP\4.4.7\sapi\php4apache2.dll"
    AddType application/x-httpd-php .php
    PHPINIDir "C:\PHP\4.4.7"
</IfDefine>

# specified 5.1.6
<IfDefine PHP5_1_6>
    LoadFile "C:\PHP\5.1.6\php5ts.dll"
    LoadModule php5_module "C:\PHP\5.1.6\php5apache2_2.dll"
    AddType application/x-httpd-php .php
    PHPINIDir "C:\PHP\5.1.6"
</IfDefine>

IfDefine ディレクティブのパラメータ名については、次の Windows サービスへの登録 へ進んで下さい。

モジュールが必要とするファイルは、LoadFile ディレクティブであらかじめ読み込んでおきます。

PHP モジュールが使用する php.ini ファイルは PHPINIDir ディレクティブで指定できます。

Windows サービスへの登録

Windows サービスへ Apache を登録するには、コマンドプロンプトから次のコマンドラインを実行します。

httpd -k install -n "サービス名" -Dパラメータ名
-k install
このオプションは、Windows サービスへ Apache を登録する事を表します。
-n "サービス名"
このオプションは、登録するサービスの名前を表します。
-D パラメータ名
このオプションは、IfDefine ディレクティブで使用するパラメータ名を表します。

試しに、PHP 5 用のサービスを登録します。コマンドプロンプトを起動して、次のように打ちます。

C:\Program....\Apache2.2\bin>httpd -k install -n "Apache2.2 with PHP5" -D PHP5

登録に成功したの図。

実際に登録されているかどうかは、[コントロール パネル] → [管理ツール] → [サービス] を開いて確かめます。(同じ画面を Apache Service Monitor の [Services] ボタンからでも開けます。)

サービス一覧。

自分が登録した Apache2.2 with PHP5 がきちんとありました。もし表示されていなければ F5 キーで画面を更新して下さい。それでも表示しなければ登録できていません。ちなみに Apache2 はインストーラが登録したサービスです。

間違ったサービス名で登録してしまったり、削除したい場合は次のコマンドラインを実行します。

httpd -k uninstall -n "サービス名"
-k uninstall
このオプションは、Windows サービスから Apache を削除する事を表します。
-n "サービス名"
このオプションは、削除するサービスの名前を表します。

サービスへの登録が終わると、Apache Service Monitor にも反映されます。

新しいサービスが登録された Apache Service Monitor。

これで、タスクバーのアイコンから切り替えが行えるようになりました。

Windows サービスへの登録についての詳しいドキュメントは、Apache HTTP サーバ バージョン 2.2 ドキュメント 内のプラットフォーム固有の情報、 Microsoft Windows 内の Running Apache as a Service にあります。

Windows サービスの補足

登録したサービスは Windows 起動時に自動的に実行されます。これを、自分で指定したタイミングで起動させる方法は次の通りです。

[コントロール パネル] → [管理ツール] → [サービス] を開いて、目的の Apache サービスを選択し、プロパティを表示します。スタートアップの種類を手動にすると、サービスは Apache Service Monitor で開始を選ぶまで開始しません。自動にすると、 Windows 起動時にサービスも開始します。無効にするとサービスを実行不可能にします。

サービスのプロパティ画面。

http://jp.php.net/manual/ja/configuration.changes.php 参照。

<IfModule mod_php5.c>
php_value include_path ".:/usr/local/lib/php"
php_admin_flag safe_mode on
</IfModule>
<IfModule mod_php4.c>
php_value include_path ".:/usr/local/lib/php"
php_admin_flag safe_mode on
</IfModule>
<IfModule mod_php3.c>
php3_include_path ".:/usr/local/lib/php"
php3_safe_mode on
</IfModule>

ただし Win32 と FreeBSD では以下の通り。

>>> for apache 2 under freebsd (not sure about other systems) it should be
>>> <IfModule sapi_apache2.c>
>>> ...
>>> </IfModule>

Same for Windows

PHP5 は mod_php5.c のままで良いのかしら?
Apache2.0.55 と PHP5.0.5 で確認したところ mod_php5.c できちんとディレクティブは有効になっていた。
IfModule ディレクティブで使用するモジュール名とは、モジュールのソースファイルと同じ。
参照 http://httpd.apache.org/docs/2.0/ja/mod/module-dict.html
この辺後で調べよう。

何の為に使うのか。IfModule ディレクティブ内に PHPIniDir を記入し、PHP4 と PHP5 で読みに行く設定ファイルを別々に持ちたい。自分で make してデフォルトの設定ファイルパスを変更する方法もあるみたい。

このモジュール名の例外が判らず、楽をしようとしたのに余計手間が掛かってしまった。説明書をちゃんと読んでいない証拠だ。反省。