ヘプタゴンの技術ブログ

サーバ/ネットワーク/linux/AWSとか青森を拠点でやってます

CentOS6でphp4とphp5を共存させる

さすがにphp4系で新規構築はなくなりましたが、
リプレイスでどうしても入れてほしいっていうケースが多々あります。
せっかくなので、php5とphp4を共存させましょうというお話です。

環境:CentOS6
apache2.2(既にインストールされているものとします)
php5はデフォルトのパッケージ版(既にインストールされているものとします)
php4はソースからインストールします

まずは事前に必要そうなパッケージをインストールします。
(本当は事前になんて分からず何度もやり直しですが。。。)

yum -y install httpd-devel bzip2-devel openssl-devel libjpeg-devel libpng-devel gmp-devel ncurses-devel flex gcc make

cd /usr/local/src

php4系の最終リリース4.4.9をダウンロード
wget http://jp2.php.net/get/php-4.4.9.tar.gz/from/this/mirror

tar xvf php-4.4.9.tar.gz
cd php-4.4.9
ここでphp5と共存させるので
MIMEタイプがphp5とかぶらないように変更

vi sapi/apache2handler/sapi_apache2.c
————–

define PHP_MAGIC_TYPE “application/x-httpd-php”

define PHP_SOURCE_MAGIC_TYPE “application/x-httpd-php-source”

define PHP_SCRIPT “php-script”

↓に変更↓

define PHP_MAGIC_TYPE “application/x-httpd-php4″

define PHP_SOURCE_MAGIC_TYPE “application/x-httpd-php4-source”

define PHP_SCRIPT “php4-script”

————–

configureを走らせます
./configure –prefix=/usr/local/php4 –with-apxs2=/usr/sbin/apxs –with-sqlite –with-mysql –with-gd –with-jpeg-dir=/usr –with-png-dir=/usr –with-zlib –with-bz2 –with-openssl –with-gettext –with-gmp –with-iconv –with-ncurses –enable-exif –enable-gd-native-ttf –enable-memory-limit –enable-mbstring –enable-mbstr-enc-trans –enable-mbregex –enable-bcmath –enable-trans-sid –enable-sysvsem –enable-sysvshm

しかし途中で
configure: error: libjpeg.(a|so) not found.
のエラーが、、、

locate libjpeg.so
/usr/lib64/libjpeg.so
/usr/lib64/libjpeg.so.62
/usr/lib64/libjpeg.so.62.0.0

ちゃんとライブラリはあるのに、、、

http://d.hatena.ne.jp/lion_and_perican/20110207/p1

を参考に

–with-libdir=lib64

とかつけてもダメ。。。。
しょうがないので、シンボリックリンクで対応。

ln -s /usr/lib64/libjpeg.so /usr/lib/
ln -s /usr/lib64/libpng.so /usr/lib/

再度、configureを走らせます

./configure –prefix=/usr/local/php4 –with-apxs2=/usr/sbin/apxs –with-sqlite –with-mysql –with-gd –with-jpeg-dir=/usr –with-png-dir=/usr –with-zlib –with-bz2 –with-openssl –with-gettext –with-gmp –with-iconv –with-ncurses –enable-exif –enable-gd-native-ttf –enable-memory-limit –enable-mbstring –enable-mbstr-enc-trans –enable-mbregex –enable-bcmath –enable-trans-sid –enable-sysvsem –enable-sysvshm

今度は成功!

コンパイルへ。

make

make: *** [ext/openssl/openssl.lo] Error 1

エラー。。。

http://www.softel.co.jp/blogs/tech/archives/3777

によると

OpenSSLのライブラリのバージョンが合わないらしく(0.9.8系と1系)、configureできてもmakeのときにエラーとなったりします。

らしいです。

修正版を拝借。
wget http://www.softel.co.jp/blogs/tech/wordpress/wp-content/uploads/2012/10/openssl.c cp openssl.c ext/openssl/openssl.c

再度コンパイル!
ちょっと豪勢に高めのec2インスタンスを用意したので、
jオプション16!
30秒くらいで終わりました。
ちなみにmicroインスタンスだと10分くらいかかりました・・・

make -j16

無事終了したのでインストール。

make install
インストール時にhttpd.confにモジュールがロードされるのでコメントアウト。

vi /etc/httpd/conf/httpd.conf
——————

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

——————

分かりやすいように、/etc/httpd/conf.d/に書き直します。
最初に直したMIMEタイプを指定。

vi /etc/httpd/conf.d/php4.conf
——————
LoadModule php4_module modules/libphp4.so
AddHandler php4-script .php
——————

/etc/init.d/httpd restart

これで、
拡張子をphpで指定するとphp5が動き、
php4と指定するとphp4が動きます。
もちろん、htaccessで切り替える事で、
拡張子がphpのファイルをphp4で動かす事も出来ます!

.htaccess
—————
AddHandler php4-script .php
—————

ちなみにAmazonLinuxだとどうしても
php4とphp5を共存させるとapache起動時に
segmentation faultが発生してしまったので諦めました…orz