バカンス駆動開発

この前バカンスって言ったら「古っ」って言われました

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()スクリプトを置いて、

http://local.php5 f:id:egapool:20160911171148p:plain

http://local.php7 f:id:egapool:20160911171756p:plain

あとがき

個人的なポイントとしては起動スクリプトにバージョン名を入れてわかりやすくしたところですかね。あと試してないですがunixソケットで通信する場合はphp-fpm.sockをphp-fpm-なんとか.confで複数つくれば良いのかなぁ。それはまた今度。