PHPの複数バージョン共存環境を構築
はじめに
実際に動くところまで記載している記事がほとんどなかったのでまとめました。
ここではPHP5.6系が入ってる環境に5.3.12を導入します
本稿で取り扱うもの
2. 別バージョンのPHPを紐付けるサービスとwebサーバーへの設定方法
3. 全体を構築するためのAnsibleスクリプト
phpenvを使って複数バージョンのPHPインストール
1 | yum install -y libyaml libyaml-devel zlib zlib-devel readline readline-devel openssl openssl-devel libxml2 libxml2-devel libxslt libxslt-devel |
次にrubyが入っていない状態を前提にして
rbenvから構築をします
1 2 | cd /usr/local/ git clone https://github.com/sstephenson/rbenv.git |
次にPATHを通す
1 2 3 4 5 | #rbenv用パス export RBENV_ROOT="/usr/local/rbenv" PATH="$RBENV_ROOT/bin:$PATH" export PATH eval "$(rbenv init -)" |
ruby-buildプラグインのインストール
1 2 3 4 5 | cd /usr/local/rbenv/ mkdir -p plugins git clone https://github.com/sstephenson/ruby-build.git cd ruby-build sh install.sh |
ruby 2.4.4のインストール
1 2 3 | rbenv install 2.4.4 rbenv rehash rbenv global 2.4.4 |
これでruby2.4.4がシステムワイドにインストールされました。
次にphpenvのインストールです。
1 2 3 4 | cd /usr/local/ git clone https://github.com/CHH/phpenv.git sh ./bin/phpenv-install.sh mv ~/.phpenv /usr/local/phpenv |
PATHの更新。rubyよりも記述は後にすることに注意。
1 2 3 4 5 6 7 8 9 10 11 | #rbenv export RBENV_ROOT="/usr/local/rbenv" PATH="$RBENV_ROOT/bin:$PATH" #phpenv export PHPENV_ROOT="/usr/local/phpenv" PATH="$PATH:$PHPENV_ROOT/bin" export PATH eval "$(rbenv init -)" eval "$(phpenv init -)" |
1 2 3 4 5 6 7 8 | cd /usr/local/phpenv mkdir -p plugins git clone https://github.com/CHH/php-build.git sh ./php-build/install.sh yum localinstall http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpma yum install -y re2c bison libjpeg-devel libpng-devel libmcrypt-devel libtidy-devel bzip2-devel libicu-devel phpenv install 5.3.12 phpenv rehash |
これでPHP v5.3.12がインストールされました。
別バージョンのサービス化
php-fpmというCGIを使います。
このphp-fpmはphpenvでインストールしたPHPのバージョン毎に
1 | /usr/local/phpenv/versions/{{ バージョン }}/sbin/php-fpm |
に作成されます。
各php本体とphp-fpmの設定ファイルは
1 2 | /usr/local/phpenv/versions/{{ バージョン }}/etc/php.ini /usr/local/phpenv/versions/{{ バージョン }}/etc/php-fpm.conf.default |
にあります。
以下の設定以外は基本的に通常通りです。
1 | listen = 127.0.0.1:9001 |
9001というポート指定をバージョンごとに変える。
9000, 9001, 9002…
と連番で関連付ければ良いです。
まずは既にインストールされているphp-fpmと同様のディレクトリに
5.3.12を実行できるファイルのリンクを貼ります
1 | ln -s /usr/local/phpenv/versions/5.3.12/sbin/php-fpm /usr/sbin/php-fpm.5.3.12 |
次に
1 | service php-fpm.5.3.12 start |
のようなコマンドで起動/停止/再起動等が出来るようにします。
1 | /etc/init.d/php-fpm.5.3.12 |
というファイルに以下内容のファイルを作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #! /bin/sh # Source function library. . /etc/init.d/functions # Check that networking is up. . /etc/sysconfig/network # Additional environment file if [ -f /etc/sysconfig/php-fpm ]; then . /etc/sysconfig/php-fpm fi if [ "$NETWORKING" = "no" ] then exit 0 fi RETVAL=0 prog="php-fpm.5.3.12" pidfile=${PIDFILE-/var/run/php-fpm/php-fpm.5.3.12.pid} lockfile=${LOCKFILE-/var/lock/subsys/php-fpm} start () { echo -n $"Starting $prog: " dir=$(dirname ${pidfile}) [ -d $dir ] || mkdir $dir daemon --pidfile ${pidfile} /usr/sbin/php-fpm.5.3.12 RETVAL=$? echo [ $RETVAL -eq 0 ] && touch ${lockfile} } stop () { echo -n $"Stopping $prog: " killproc -p ${pidfile} php-fpm RETVAL=$? echo if [ $RETVAL -eq 0 ] ; then rm -f ${lockfile} ${pidfile} fi } restart () { stop start } reload () { echo -n $"Reloading $prog: " if ! /usr/sbin/php-fpm.5.3.12 --test ; then RETVAL=6 echo $"not reloading due to configuration syntax error" failure $"not reloading $prog due to configuration syntax error" else killproc -p ${pidfile} php-fpm -USR2 RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} php-fpm RETVAL=$? ;; restart) restart ;; reload|force-reload) reload ;; configtest) /usr/sbin/php-fpm.5.3.12 --test RETVAL=$? ;; condrestart|try-restart) [ -f ${lockfile} ] && restart || : ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart|configtest}" RETVAL=2 ;; esac exit $RETVAL |
これでPHP v5.3.12のCGIを
1 | service php-fpm.5.3.12 start |
のように起動出来るようになりました。
Nginxの設定
前項で触れたポート番号をfast_cgi設定を以下のようにするだけ
1 | fastcgi_pass 127.0.0.1:9001; |
またPHPのバージョンを変更したいドキュメントルートにて
1 | phpenv local 5.3.12 |
と実行する。
のバージョンとポート番号が一致していて
かつサービスとしてphp-fpmが起動していないとPHPが正常に動作しません。
Ansibleで自動ビルド
上述のphp-fpmサービス化までの共通部分をansibleのplaybookにしてGitHubにて公開。
https://github.com/m-ohba-sterfield/ansible
Author Profile
スターフィールド編集部
SHARE