phpenvで複数バージョンのPHPを同時に利用する
1つのvagrantで複数のPHPを同時に利用できるようにします。この記事では5.6.23と7.0.0を共存させます。
CentOS6.5でapache2.4.6+PHP-FPMの構成です。
phpenv,php-buildはインストールされている前提で始めます。
起動スクリプトの用意とListenするポートの設定
php5.6.23のインストール
$ phpenv install 5.6.23 [Info]: Loaded extension plugin [Info]: Loaded apc Plugin. [Info]: Loaded composer Plugin. [Info]: Loaded github Plugin. [Info]: Loaded uprofiler Plugin. [Info]: Loaded xdebug Plugin. [Info]: Loaded xhprof Plugin. [Info]: php.ini-production gets used as php.ini [Info]: Building 5.6.23 into /home/vagrant/.phpenv/versions/5.6.23 [Downloading]: https://secure.php.net/distributions/php-5.6.23.tar.bz2 [Preparing]: /tmp/php-build/source/5.6.23 [Compiling]: /tmp/php-build/source/5.6.23 [xdebug]: Installing version 2.3.3 [xdebug]: Compiling xdebug in /tmp/php-build/source/xdebug-2.3.3 [xdebug]: Installing xdebug configuration in /home/vagrant/.phpenv/versions/5.6.23/etc/conf.d/xdebug.ini [xdebug]: Cleaning up. [Info]: Enabling Opcache... [Info]: Done [Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.5.6.23.20160911071038.log [Success]: Built 5.6.23 successfully. // 設定ファイルを作成 $ cp /home/vagrant/.phpenv/versions/5.6.23/etc/php-fpm.conf.default /home/vagrant/.phpenv/versions/5.6.23/etc/php-fpm.conf
サービスに追加
// 起動スクリプトを移動 sudo cp /tmp/php-build/source/5.6.23/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm-5.6.23 // 実行権限付与 sudo chmod 775 /etc/init.d/php-fpm-5.6.23 // システム起動時に自動起動するように設定 sudo chkconfig php-fpm-5.6.23 on // 確認 sudo chkconfig --list | grep php-fpm php-fpm-5.6.23 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ポートを変更
FPMはデフォルトで9000番のポートをリッスンするようになっていますが、複数バージョンのPHPを共存させる場合はこのポート番号をずらして運用します。
vi /home/vagrant/.phpenv/versions/5.6.23/etc/php-fpm.conf listen = 127.0.0.1:9000 ↓ listen = 127.0.0.1:9001
同じことをPHP7.0.0で繰り返します。ポートは9002にします。
vi /home/vagrant/.phpenv/versions/7.0.0/etc/php-fpm.conf listen = 127.0.0.1:9000 ↓ listen = 127.0.0.1:9002
注)etc/php-fpm.confにlistenの記述がない場合は、etc/conf.d/www.confにあると思うのでそちらを変更してください。
vhostsの設定
あとはvhostsの設定でドメインごとにfcgiに投げるポート番号を対応させればOKです。
- local.php5 → 9001番ポート
- local.php7 → 9002番ポート
## PHP5.6.23 <VirtualHost *:80> ServerName local.php5 #DocumentRoot /var/www/html/php5 <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/var/www/html/php5/$1 <Directory "/var/www/html/php5"> AllowOverride All Options -Indexes +FollowSymLinks Require all granted </Directory> </VirtualHost> ## PHP7.0.0 <VirtualHost *:80> ServerName local.php7 <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9002/var/www/html/php7/$1 <Directory "/var/www/html/php7"> AllowOverride All Options -Indexes +FollowSymLinks Require all granted </Directory> </VirtualHost>
ブラウザから見てみる
それぞれのパブリックにphpinfo()スクリプトを置いて、
あとがき
個人的なポイントとしては起動スクリプトにバージョン名を入れてわかりやすくしたところですかね。あと試してないですがunixソケットで通信する場合はphp-fpm.sockをphp-fpm-なんとか.conf
で複数つくれば良いのかなぁ。それはまた今度。