PHP の動作がおかしいので再インストール [Install Maniax 3]

インストールマニアックス 3 も残すところ一日となって迫って焦っているところだが、ここに至って PHP がエラーになってしまいどうにもうまく動いてくれない。
MySQL の操作を Web 経由で楽に行なおうと、phpMyAdmin をインストールして Web ブラウザからアクセスしたところ「mysql 拡張をロードできません」というエラーが表示される。
これはいけないと PHP の設定を見直しても、原因が皆目見当つかない。

PHP の MySQL エクステンションをインストールし忘れたかと、PHP の再インストールを試みるがうまくいかない。
しかも PHP を再インストールする度に、IIS のハンドラーマップの設定が書き換えられてしまうため、とても鬱陶しい。
そこで、PHP を一度アンインストールしてしまい、改めてインストーラーを使わずにインストールし直して、原因を調べることにする。

まずは PHP のアンインストールからだ。
インストールしたときのファイル php-5.3.1-Win32-VC9-x86.msi をもう一度実行すると、インストールウィザードのダイアログが開く。
最初のダイアログで「Next」をクリックすると、Setup Type を訊くダイアログになるが、ここに「uninstall」ボタンが増えているはずだ。
PHP をアンインストールするには、この「uninstall」ボタンをクリックするだけだ。

PHP をアンインストールしたら、次はインストーラーを使わずに PHP のインストールを行う。
最初に PHP の公式サイトにある Windows 用 PHP のダウンローページ から PHP 5.3.1 の zip パッケージをダウンロードしてくる。
改めてダウンロードしたのは php-5.3.1-Win32-VC9-x86.zip だ。
これを解凍して、その中身をすべて C:Program Files (x86)PHP フォルダにコピーする。
C:Program Files (x86)PHP フォルダは前に PHP インストーラーを使ってインストールしたときに作成され、そのまま残っているはずだ。

C:Program Files (x86)PHP フォルダにコピーしたら、次はこのフォルダを環境変数 PATH に追加する。
Server Core でシステム全体の環境変数を編集するには、レジストリエディタを使う。
コマンドプロンプトで regedit コマンドを実行して、レジストリエディタを起動したら、以下のレジストリを編集して C:Program Files (x86)PHP; を追加すればいい。

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment
Path
レジストリエディタで環境変数 PATH を編集

php.ini ファイルは、zip ファイルの中に php.ini-production や php.ini-development ファイルがあるので、これを元に作成する。
今回はインストーラーを使って PHP をインストールしたときに用意した php.ini が C:inetpubphp フォルダに残っていたので、これをそのまま使うことにする。

次は IIS のハンドラーマップの登録と FastCGI の設定だ。
インストーラーを使って PHP をインストールしたときは、これらはインストーラーによって設定されていたが、アンインストールに伴ってこれらも削除されているはずだ。
そこで インターネット インフォメーション サービス (IIS) マネージャーのハンドラーマッピングを開き、右側の操作ペインで「モジュール マップの追加...」をクリックする。
表示された「モジュールマップの追加」ダイアログの各欄に以下のように入力して「OK」ボタンをクリックする。

要求パス
*.php
モジュール
FastCgiModule
実行可能ファイル
"C:Program Files (x86)PHPphp-cgi.exe"| -c "C:inetpubphpphp.ini"
名前
PHP_via_FastCGI
モジュールマップの追加 モジュールマップの編集後の FastCGI アプリケーション作成の確認

「モジュールマップの追加」ダイアログの各欄に入力して「OK」ボタンをクリックすると、FastCGI アプリケーションを作成するかを訊いてくるダイアログが表示されるので、「はい」をクリックする。
これで FastCGI の設定の方も一緒に設定されている。
ただし FastCGI の初期値のままでは若干の不具合があるので、そこだけを修正しておく。

エントリを右クリックしてコンテンツメニューから「編集…」を選ぶと、「FastCGI アプリケーションの編集」ダイアログが表示される。

FastCGI アプリケーションの編集

「FastCGI アプリケーションの編集」ダイアログで以下の各欄をそれぞれ修正して、「OK」ボタンを押す。

アクティビティ タイムアウト
600
要求タイムアウト
600
インスタンスの MaxRequests
10000

IIS のアプリケーションプールの設定は、以前のままで特に手を触れる必要はない。

これで zip パッケージからの PHP のインストール作業は完了だ。

さっそく動作を確認するために、Web ブラウザで http://maniax3.compnet.jp/phpinfo.php (インストール マニアックス 3 のルールに規定される公開期限を過ぎたために、サイトを閉 鎖した) にアクセスしてみる。
問題なく表示されたことを確認して、改めて phpMyAdmin にアクセスすると…、やはり「mysql 拡張をロードできません」というエラーが表示されてしまう。
よくよく調べてみると、実は php.ini ファイルの中にダブルコーテーションマーク (") で終端されていない文字列が存在していることが原因だった。
この終端されていない文字列が extension= の行よりも前にあったために、エクステンションが全く読み込まれなかったらしい。

そこで php.ini ファイルをきちんと修正して、もう一度 http://maniax3.compnet.jp/phpinfo.php にアクセスすると、…今度は「500 内部エラー」になる。
動作を確認するためにコマンドラインから以下のコマンドを実行する。

"C:Program Files(x86)PHPphp-cgi.exe" -c "c:inetpubphpphp.ini" "c:inetpubwwwrootphpinfo.php"

すると、しっかりと異常終了してくれる。

PHP の異常終了

以下のように php.ini を指定しないで実行すると正しく動作するので、php.ini のどこかがおかしいのは間違いない。

"C:Program Files(x86)PHPphp-cgi.exe" "c:inetpubwwwrootphpinfo.php"

そこで、php.ini ファイルの一部を削除して実行することを繰り返して、php.ini ファイルの問題箇所を特定した。
原因は zip エクステンションの読み込みにあった。

zip エクステンションを使うために extension=php_zip.dll を有効にすると異常終了し、これをコメントアウトすると何の問題もなく実行できる。
PHP を展開したフォルダをよく見直すと、php_zip.dll ファイルはどこにも存在していない。
しかし、php.ini ファイルの作成元になる php.ini-production や php.ini-development ファイルのどちらにも、コメントにされてはいるものの extension=php_zip.dll の行が書かれている。
この行をコメントアウトするときは、php_zip.dll ファイルが実際に存在しているか確認して、存在していないならどこかから入手してから行うように注意しよう。

コメントを残す