PHP5 環境に PHP4 を共存させる

SERVER

PHP4 と PHP5 を切り替えて使用できるように、PHP5 がインストールされている CentOS 5.4 の Apache に PHP4 を追加でインストールして、共存できるようにしてみました。


PHP5 の他に PHP4 も使えるようにする

世間ではだいぶ PHP5 を想定したスクリプトが多くなってきたようですけど、PHP5 と PHP4 とでは言語の構文が違ったりして、既に PHP4 で動作しているスクリプトを持っていたりすると、なかなか簡単に PHP5 に統一するということが難しいように思います。

そこで CentOS 5.4 上の PHP 5.1.6 がインストールされている Apache 2.2.3 で、PHP4 も利用できるようにサーバーの設定を調整してみることにしました。

 

今回想定している環境は、64 ビット版の CentOS 5.4 で、そこには標準パッケージの php 5.1.6 が Apache 2.2.3 上で動作しているものとします。

そこに新たに php 4.4.9 のソースコードを入手して、既存の php 5 と共存する形で組み込むこととします。

 

PHP 4.4.9 をインストールする

ソースコードの準備

まず、PHP 4.4.9 のソースコードを入手します。

平成 22 年 6 月 8 日現在、http://jp2.php.net/get/php-4.4.9.tar.gz/from/this/mirror から入手できるようになっていましたので、今回は次のようにして /usr/local/src ディレクトリーに準備します。

cd /usr/local/src

wget http://jp2.php.net/get/php-4.4.9.tar.gz/from/this/mirror

 ソースコードの準備が出来たら、次のようにして展開し、展開されたディレクトリーへ移動します。

tar xvzf php-4.4.9.tar.gz

 

cd php-4.4.9/

ここで、展開された "sapi/apache2handler/sapi_apache2.c" ファイルの内容を変更します。

テキストエディターで当該ファイルを開いたら、次の表のように修正を加えます。

#define 項目名 変更前の値 変更後の値
PHP_MAGIC_TYPE application/x-httpd-php application/x-httpd-php4
PHP_SOURCE_MAGIC_TYPE application/x-httpd-php-source application/x-httpd-php4-source
PHP_SCRIPT php-script  php4-script

このような形で修正したら、続いて、コンパイル作業に移ります。

ソースコードのコンパイル

既存の PHP5 を上書きしてしまわないように、次のように "--prefix" オプションを指定して configure を実行します。

./configure --prefix=/usr/lib64/php-4.4.9 --with-apxs2=/usr/sbin/apxs --enable-mbstring --enable-zend-multibyte --with-mysql

ここでは "/usr/lib64/php-4.4.9" というディレクトリに PHP4 をインストールするようにしています。また、"--with-apxs2" オプションを指定することで、Apache に組み込むための "libphp4.so" モジュールを生成するようにしています。

他にも、この例では "--enable-mbstring" や "--enable-zend-multibyte"、"--with-mysql" オプションも合わせて設定していますが、これだけでは足りないところもあるでしょうから、実際に必要なものを追加して行く形になると思います。

configure を実行すると、場合によっては次のようなメッセージが表示されて、処理が中断されてしまう場合があります。

checking lex output file root... ./configure: line 2554: lex: command not found

configure: error: cannot find output from lex; giving up

これは "flex" というプログラムがインストールされていないのが原因なので、次のようにして flex をインストールしてから configure を再実行します。

yum install flex

 

また、次のようなメッセージが表示されるような場合もありました。

The output of /usr/sbin/apxs follows:

./configure: line 5670: /usr/sbin/apxs: No such file or directory

configure: error: Aborting

この場合は "httpd-devel" というパッケージが不足しているのが原因なので、次のようにして httpd-devel をインストールします。

yum install httpd-devel

 

configure が完了したら、次のようにして PHP4 のコンパイルを行います。

make

コンパイルに成功したら、引き続き PHP4 のインストールを行います。

PHP4 のインストール

コンパイルした PHP4 を次のようにしてインストールします。

make install

このようにした段階で、PHP4 のモジュールを組み込むための命令が "/etc/httpd/conf/httpd.conf" に追記されているので、途中でやめるような場合には注意しましょう。

 

これで PHP4 の構成ファイルが OS にインストールされるので、残りの作業は設定を調整して行く感じになります。

php.ini ファイルの準備

まずは次のようにして、PHP4 のソースコードに同梱されていた "php.ini-recommended" ファイルを "/usr/lib64/php-4.4.9/lib" ディレクトリーにコピーします。

cp php.ini-recommended /usr/lib64/php-4.4.9/lib/php.ini

ここでは configure の際に "/usr/lib64/php-4.4.9" をインストールディレクトリーとしていたので、コピー先が "/usr/lib64/php-4.4.9/lib/php.ini" となっています。他のパスを指定していた場合にはそれに合わせて命令を変えて行ってください。

 

php.ini ファイルの準備ができたら、その準備した "/usr/lib64/php-4.4.9/lib/php.ini" ファイルの内容を調整します。

ファイル内の ";include_path = ".:/php/includes" という行を探して、そこに一行追加して、次のような感じで include_path をインストールしたディレクトリーの "php" ディレクトリを指すようにします。

; UNIX: "/path1:/path2"

;include_path = ".:/php/includes"

include_path = ".:/usr/lib64/php-4.4.9/lib/php"

追加する "include_path" の行は、先頭にセミコロン ( ; ) を記載しないように注意します。

 

シンボリックリンクの作成

 そして、これは必須ではありませんが、PHP4 を扱いやすくするために、次のようにしてシンボリックリンクを作成しておくと良いでしょう。

ln -s /usr/lib64/php-4.4.9/bin/php /usr/bin/php4

ln -s /usr/lib64/php-4.4.9/bin/pear /usr/bin/pear4

ln -s /usr/lib64/php-4.4.9/etc/php.ini /etc/php4.ini

これで、PHP4 コマンドは "/usr/bin/php4" で利用できますし、"/etc/php4.ini" を編集することで設定を変更することができるようになります。

 

Apache を設定する

最後に Web サーバーの設定を行います。

 

httpd.conf ファイルの調整

まず、"/etc/httpd/conf/httpd.conf" ファイルを編集して、PHP4 のインストール時に追加された "LoadModule php4_module /usr/lib64/httpd/modules/libphp4.so" の行をコメントアウトします。

# LoadModule php4_module /usr/lib64/httpd/modules/libphp4.so

これは、理由は分かりませんが、自分の環境ではこのまま Apache を再起動すると "Segmentation Fault" が発生して Apache が起動できなかったためです。

/etc/httpd/conf.d/php.conf ファイルの調整

ここには、既存の PHP5 モジュールを組み込むための LoadModule が記されているので、そこに PHP4 モジュールの読み込みも追加します。

LoadModule php5_module modules/libphp5.so

LoadModule php4_module modules/libphp4.so

さらに、PHP5 用の "AddHandler" と "AddType" にならって、次のように PHP4 用のものも追加します。

AddHandler php4-script .php4

AddHandler php5-script .php

 

AddType text/html .php4

AddType text/html .php

ここの "AddType" では、コンパイルの準備の際に編集した "application/x-httpd-php4" を設定するのが筋のような感じもしますけど、今回はとりあえず、既定の Apache の設定にならって "text/html" を設定してみることにしました。

どちらでも動作するようでしたが、うまく行かない場合は変えてみると良いかもしれません。

ともあれこれで、拡張子 ".php" のファイルは従来通り PHP5 で、拡張子 ".php4" の場合は PHP4 で、処理がされるような設定になります。

 

Apache を再起動する

これで設定ファイルの調整が完了したので、次のようにして Apache を再起動して、設定を反映させます。

service apache restart

これで問題なく Apache が起動したら、設定は完了です。

動作するかの確認は、ファイルの内容を "<?php phpinfo() ?>" としたファイル "info.php" と "info.php4" とを Web サイト上に用意して、それをブラウザーで参照して、PHP に関する詳細情報ページが表示されるかどうかで判断できます。

拡張子が "php" の方を表示したときには PHP5 の情報が、"php4" の方を表示したときには PHP4 の情報が、それぞれ表示されれば、正しく動作していることになります。

 

.htaccess で PHP4 と PHP5 とを切り替える

AllowOverride で Fileinfo のオーバーライドが許可されていれば、".htaccess" を使用して、php4 の実行を許可することもできます。

AddHandler php4-script .php

例えばこのようにすることで、拡張子 "php" のファイルを PHP4 で実行することが可能になります。