nihimotoの日記

https://mapsengine.google.com/map/edit?mid=zhpqXW1XM-zc.kmD-c8p1GAWI

さくらVPSでphp5.3/5.2/5.1 が同居する環境を構築してみた

受託でphpの開発をやっていると、本番環境のphpのバージョンが選べないことがよくあります。しかし、手元のデバック用のサーバーはphp5.*ひとつに固定されており、これが本番環境のバージョンとずれていると、本番にアップしたときに思わぬトラブルを引き起こしたりすることが、ままあります。


そのため、手元のさくらVPSに構築しているデバック用サーバーをいじくりまわして、手軽にphpのバージョンを切り替えられるようにがんばってみました。複数のバージョンのphpが同居する環境が作れればとても便利になりそうです。
とは言っても、下記のブログの手順にほとんど従っただけなのですが。ありがとうござます。

Apache2で複数バージョンのPHPを使い分ける - エーエイチレフ linuxサーバー技術情報
http://www.ahref.org/tech/server/server-tips/667.html


しかし、この記事とは違うバージョンを入れていたり、64bitの都合上(?)幾つか工夫しなければいけない点があったので、自分の取った手順を記載しておきます。


まず今回の構築で目指したのはこちら
・メインはphp5.3
・サブとしてphp5.2 と php5.1 のCGI版を突っ込む


いずれのバージョンも大きな差分はないのですが、細かいことでいやらしいトラブルを起こしてくれるんですよね・・なお、php4はもう切り捨てるべきだと思っているので対応を考えていません。

ということで、まずはメインのphp5.3から。

yum install php53
yum install php53-devel
...その他必要なものをひと通りyumでインストール

これはなんの工夫もなく普通にyumで突っ込みます。
モジュール版でいいので楽です。


次にphp5.2

wget http://museum.php.net/php5/php-5.2.16.tar.gz
tar zxvf php-5.2.16.tar.gz
cd php-5.2.16
LDFLAGS=-L/usr/lib64/mysql ./configure --prefix=/usr/local/lib/php-5.2 --with-config-file-path=/usr/local/lib/php-5.2 --libdir=/usr/lib64 --with-zlib --with-zlib-dir=/usr/include/ --enable-fastcgi --enable-cgi --enable-force-cgi-redirect --enable-mbstring --enable-mbstr-enc-trans --enable-track-vars --enable-mbregex --with-mysql=/usr/lib64/mysql --with-mysqli=/usr/lib64/mysql/mysql_config --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --program-suffix=52 --enable-zend-multibyte
LDFLAGS=-L/usr/lib64/mysql make
LDFLAGS=-L/usr/lib64/mysql make install

これでとりあえずCGI版が /usr/local/lib/php-5.2.16/bin/php-cgi52 に入りました。


※なお ./configure の途中でhogehogeがありません的なエラーが出たら、hogehoge-develをyumで探してインストールすれば大抵解決します。
参照元記事と違い LDFLAGS=-L/usr/lib64/mysql が頭についていますが、これはどうも64bitのCPUで動かす場合に必要っぽいです


次にphp5.1。

wget http://museum.php.net/php5/php-5.1.6.tar.gz
tar zxvf php-5.1.6.tar.gz
cd php-5.1.6
LDFLAGS=-L/usr/lib64/mysql ./configure --prefix=/usr/local/lib/php-5.1 --with-config-file-path=/usr/local/lib/php-5.1 --libdir=/usr/lib64 --with-zlib --with-zlib-dir=/usr/include/ --enable-force-cgi-redirect --enable-mbstring --enable-mbstr-enc-trans --enable-track-vars --enable-mbregex --with-mysql=/usr/lib64/mysql --with-mysqli=/usr/lib64/mysql/mysql_config --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --program-suffix=51
LDFLAGS=-L/usr/lib64/mysql make
LDFLAGS=-L/usr/lib64/mysql make install

これで /usr/local/lib/php-5.1/bin/php51 がCGI版としてインストールされます。


そうしたら次はapacheの設定に移ります。
httpd.conf を開き

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

が記載されていることを確認したら


...

の中に

Options FollowSymLinks

を追記します。
そうしたら一度httpdを再起動します。


次に /var/www/cgi-bin に移動して

ln -s /usr/local/lib/php-5.1/bin/php51 php51
ln -s /usr/local/lib/php-5.2/bin/php-cgi52 php52

シンボリックリンクを作成します。


※何故これをするのかはややこしいので、参考元リンクをご覧ください。


さぁ、これで準備完了です。

普通に php5.3 を使いたいフォルダでは普通にphpを設置しましょう。それでphp5.3として動作します。
もしphp5.2を使いたいフォルダがあれば、そのフォルダに.htaccessを設置して、

Action php52-script /cgi-bin/php52
AddHandler php52-script .php

と記載しましょう。
これでそのフォルダ以下に設置したphpは5.2のCGI版として動作するはずです。
php5.1なら下記になります。

Action php51-script /cgi-bin/php51
AddHandler php51-script .php

以上です。


こちらを試してステキなテスト環境を作ってみるといいと思います。
なお、CGI版なので本番環境での使用はあまりおすすめできません。セキュリティ的にも少しどうなの?と思わなくもないですし。テスト環境限定の技だと考えたほうが無難だと思います。

※1月12日追記
CGI環境だとhtaccessによるphp_valueやphp_flagの上書きができないので注意。php.iniで設定を変えるしかありません。mod_suPHPを使えばphp.iniをユーザディレクトリに設置できるらしいのでそれを使うという手があるみたいですが、この同居環境にうまく入れるのは面倒くさそうなので試してません・・・

※2016/9/21 追記
php7でも同様の手順で成功

wget http://museum.php.net/php5/php-7.0.9.tar.gz
tar zxvf php-7.0.9.tar.gz
cd php-7.0.9
LDFLAGS=-L/usr/lib64/mysql ./configure --prefix=/usr/local/lib/php-7.0 --with-config-file-path=/usr/local/lib/php-7.0 --libdir=/usr/lib64 --with-zlib --with-zlib-dir=/usr/include/ --enable-force-cgi-redirect --enable-mbstring --enable-mbstr-enc-trans --enable-track-vars --enable-mbregex --with-mysql=/usr/lib64/mysql --with-mysqli=/usr/lib64/mysql/mysql_config --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --program-suffix=70 --enable-intl --with-pdo-mysql --with-curl
LDFLAGS=-L/usr/lib64/mysql make
LDFLAGS=-L/usr/lib64/mysql make install

※必要に応じて --enable-intl --with-pdo-mysql を追加