パンダのメモ帳

技術系のネタをゆるゆると

CentOS 5 で PHP4 と PHP5 を共存させる

CentOS 5.5(5.4) で稼働している同一サーバー上で PHP4 と PHP5 を共存させる方法について。

1. 要件

今回の要件は以下の通り。

  • Apache (httpd) および PHP5 はOS標準のパッケージを使用する(すでにインストールされているものとする)。
  • PHP4 をソースコードからコンパイルし、Apacheのモジュールとして組み込む。
  • PHP4 と PHP5 を同時に実行できる環境を構築する。

2. 注意

PHP4 は2008年でサポートが終了しており、セキュリティメンテナンス等がすでに行われていない。どうしても PHP4 が必要、という場合でない限り、PHP4 の使用はおすすめできない。今回は PHP4 で構築されたアプリケーションを PHP5 を維持したまま同一サーバー上で動作させる必要があったため、やむなく行った。

3. 準備

まず、現在の httpd.conf をどこかにバックアップしておく。

[root@localhost ~]# cd /etc/httpd/conf
[root@localhost conf]# cp httpd.conf httpd.conf.tmp

PHP4 の最終バージョン(4.4.9)のアーカイブを取得し、解凍する。

[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget http://jp2.php.net/get/php-4.4.9.tar.gz/from/this/mirror
[root@localhost src]# tar xvf php-4.4.9.tar.gz

4. PHP4 のインストール

PHP4 のインストール(configure, make)を行う前に、共存させる上でソースコードの変更が1カ所必要になる。

[root@localhost src]# cd php-4.4.9
[root@localhost php-4.4.9]# vim sapi/apache2handler/sapi_apache2.c

以下のような部分を探し、次の通り変更する。

#define PHP_MAGIC_TYPE "application/x-httpd-php"

#define PHP_MAGIC_TYPE "application/x-httpd-php4"

変更したら、configure → make を実行する。configure オプションで prefix を指定することで、標準の PHP5 ファイル群を上書きしないようにする。configure 実行時にエラーが発生する場合は必要なモジュールをインストールする必要がある。今回は次の通り実施。

[root@localhost php4.4.9]# yum -y install \
  httpd-devel \
  bzip2-devel \
  openssl-devel \
  libjpeg-devel \
  libpng-devel \
  gmp-devel \
  ncurses-devel
(中略)
[root@localhost php4.4.9]# ./configure \
  --prefix=/usr/local/php4 \
  --with-apxs2=/usr/sbin/apxs \
  --with-sqlite \
  --with-mysql \
  --with-gd \
  --with-jpeg=/usr/lib \
  --with-png=/usr/lib \
  --with-zlib \
  --with-bz2 \
  --with-openssl \
  --with-gettext \
  --with-gmp \
  --with-iconv \
  --with-ncurses=shared \
  --enable-exif \
  --enable-gd-native-ttf \
  --enable-memory-limit \
  --enable-mbstring=shared \
  --enable-mbstr-enc-trans \
  --enable-mbregex \
  --enable-bcmath \
  --enable-trans-sid \
  --enable-sysvsem \
  --enable-sysvshm
(中略)
[root@localhost php4.4.9]# make
(中略)
[root@localhost php4.4.9]# make install

php.ini をコピーして作成する。コピー後、必要に応じて内容を編集する。

[root@localhost php4.4.9]# cp php.ini-dist /usr/local/php4/lib/php.ini

5. Apache の設定

PHP4 のインストール前準備でバックアップしておいた httpd.conf から復元する。

[root@localhost ~]# cd /etc/httpd/conf
[root@localhost conf]# rm httpd.conf
[root@localhost conf]# mv httpd.conf.tmp httpd.conf

/etc/httpd/conf.d に php4.conf を次の通り作成する。AddType の MIMEタイプにソースコード修正時に指定した MIMEタイプを指定するのがミソ。

LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php4 .php4

Apache を再起動する。

[root@localhost ~]# service httpd restart

以上で拡張子 .php4 の場合は PHP4スクリプトとして実行されるようになる。後は .htaccess などで、特定のディレクトリ以下のみ .php を PHP4スクリプトとして実行したりもできる……んじゃないかなぁ?

6. 参考

今回の作業、および記事の作成にあたって以下のページを参考にした。また、今回とは異なる手法での共存方法などもあるので参考にして欲しい。