WPのPHP7動作確認は VAWの PHPバージョン切替え phpenv.sh がお勧め!

最近お気に入りの Vagrant の WordPress 開発環境 VAW で PHP7に切り替えてプラグイン等の動作確認を行っています。その時にちょっとトラブったので、PHPバージョン切替時の注意点等を紹介します

VAW(Vagrant Ansible WordPress)は、WordPress の 開発/テスト環境を構築する Ansible playbook です。Apache や Nginx サーバー、MySQL や Mariadb, percona データベース、 php バージョンの切り替え等を簡単に行えるので、いろいろな環境を試してみたいという場合にお勧めの仮想マシン構築ツールです

PHPバージョン切り替え

VAWは、デフォルトで PHP 5.6.12 がインストールされてますが、PHPバージョンを切り替えられるように phpenv, php-build, phpenv-apache-version 等のツールがはじめから導入されています

もちろんプロビジョニング時に PHP7 等の異なるバージョンを指定してもインストールしてくれるのですが、その場合はプロビジョニング時にPHPのダウンロード、コンパイル、切り替え処理等が行われるのでプロビジョニングに大変時間がかかります

従って、一旦デフォルトのPHPバージョンのままプロビジョニングを行って環境を構築し、後から切り替えを行うのがお勧めです

ツールについて

phpenv システム全体や各ディレクトリ毎に使用するPHPバージョンの切り替え管理ツール
php-build PHPをビルド(コンパイルと構築)するツール
phpenv-apache-version ApacheのPHPモジュール切り替え管理ツール

PHPのコンパイルやバージョン切り替えたい場合に、phpenv, php-build 等のツールを導入して使えるように構築するのはけっこう大変です

検索すれば多くの事例が紹介されていますが、結構苦労すると思います

また、環境を構築した後も phpenv コマンドを使い分けながらインストール、ビルド、切り替え、httpd 再スタート等を行うのは面倒です

VAWでは、はじめからこれらのツールが導入されているし、これらのツールをまとめてうまい具合に処理してくれる phpenv.sh シェルプログラムもあるので直接ツールを使う必要もありません

phpenv.sh を使わない場合と使った場合にどれ位違いがあるか比較してみます

 

Phpenv.sh シェルプログラムを使用しない場合

試しに ver5.5.32 をインストールして切り替えてみます
vagrantユーザー権限でインストールすると生成モジュールの配置時に権限エラーが発生するので su でroot 権限にしてから実行しています

phpenv

バージョン 5.5.32 をインストールしただけで、まだ切り替えていません

バージョンを確認しても 5.6.12 が現在のバージョンとして表示されますが、ブラウザからはアクセス出来なくなってしまいました

service httpd restart でリスタートを実行

phpinfo でバージョンを見ると Apacheの libphp5.so モジュールは 5.5.32 になっていました。PHPをビルドした時に /usr/lib64/httpd/modules/libphp5.so と /etc/httpd/modules/libphp5.so モジュールが上書きされたようです

これはよろしくないです (>_<)

PHPをビルドする毎に上書きされるようなので、install 実行する前に必要に応じて切り替え前のモジュールを移動、保存しておかないとバージョン切り替え毎にビルドが必要になってしまいます

ということはバージョン切り替えは、インストールを同時に行うか否かによって手順が別れるので、間違いやすいく面倒なことが分かります

インストール可能なバージョンリストの確認
phpenv install -l

インストール&バージョン切替
必要に応じて Php apache module phplib5.so をバージョンごとに移動・保存しておく
phpenv install 5.5.32
phpenv global 5.5.32
phpenv rehash
service httpd restart

インストール済みでバージョンのみ切替
例えば 5.6.12 へ戻す場合
保存していた5.6.12 の phplib5.so を /etc/httpd/modules/libphp5.so に上書き
phpenv global 5.6.12
phpenv rehash
service httpd restart

モジュールはインストールの方法(ソースから構築とかパッケージから)、権限、ディストリビューション等の違いでどこに生成されるのかが変わるようで、よくわからない部分も多いですが root権限でビルドしてインストールすると /etc/httpd/conf/httpd.conf に自動的にロードモジュールの記述が行われます

php7 の場合は、モジュール名が phplib7.so となるので、ロードモジュールを有効化している /etc/httpd/conf/httpd.conf や /etc/httpd/conf.d/php.conf ファイルも合わせて修正する必要があります

Httpd.conf やモジュールロードに関して下記情報も参考になります

このやり方でバージョン切り替えを出来ないわけではありませんがお薦めは出来ません

 

Phpenv.sh シェルプログラムを使う場合

phpenv.sh シェルプログラムは、指定したバージョンがなければ、ダウンロードして、ビルド、バージョン切り替え、サーバー再スタートまでやってくれます。

また、既に指定したバージョンが存在していればバージョン切り替え、サーバー再スタートだけをやるので使い分ける必要がありません

とにかく使いたいバージョンを指定するだけというシンプルさです

phpenv.sh オプション

phpenv.sh list インストール可能なバージョンのリスト表示
phpenv.sh version 現在のバージョンを表示
phpenv.sh versions インストールされているバージョンを表示
phpenv.sh x.x.x 指定したバージョン番号のPHPへ切り替えます
※指定バージョンがインストールされていない場合はビルド、インストールも行われます

試しに PHP7.0.3 に切り替えてみます

ターミナルから vagrant ユーザー権限で /vagrant/command/phpenv.sh 7.0.3 と入力します

phpenv_sh

自動的に phplib7.so モジュールを /etc/httpd/modules/libphp7.so から /home/vagrant/.phpenv/versions/7.0.3 に移動して保存してくれるし、httpd 再スタートまで行ってくれます

php7 を試してみたいって思ったら php7 へ切り替えられるし、やっぱり php5.6 に戻したいという場合もあっという間に戻ります (^^)

注意
phpenv.sh シェルプログラムは root権限で実行しないように注意ですVAW では、phpモジュールに関しては、httpd.conf から設定ファイルを php.conf  ファイルに分けて管理しており、 httpd.conf からそのファイルを読み込むようになっています

 

root 権限でPHPをビルドしてインストールすると httpd.conf にモジュールロードの記述がされてしまうようで、その結果 httpd.conf と php.conf 間で2重に読み込んだり、PHPバージョンの違うモジュールを読み込もうとしたりしてエラーとなる場合があります

 

もしも間違えて root権限で実行してしまい、切替時に  segmentation false が発生する場合は、
下記ファイルを確認しましょう

/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/php.conf

 

この中にあるロードモジュールが不整合を起こしていると思われます

LoadModule php5_module        /usr/lib64/httpd/modules/libphp5.so
LoadModule php7_module        /usr/lib64/httpd/modules/libphp7.so

 

Httpd.conf にこれらの記述がある場合は、先頭に # マークを付けて無効化します
Php.conf は指定したモジュールのみが有効化されている必要があります

 

Php5 と php7 の両方のモジュールが有効だと segmentation false が発生しますので
修正して service httpd restart を実行します

 

VAWでPHPバージョン切り替えを行うなら phpenv.sh シェルプログラムを使うのが鉄則です

phpenv.sh を使えば、PHPバージョンの切り替えが楽々です (^^)

 

補足

ちなみにデフォルトのPHP構築オプションは下記のようになっています

VAWの Ansible の role フォルダー下に phpenv\templates\default_configure_options.j2 テンプレートとして指定されていて、仮想マシン内の下記ファイルに設定されます

/home/vagrant/.phpenv/plugins/php-build/share/php-build/default_configure_options

–with-apxs2=/usr/sbin/apxs
–enable-fpm
–without-pear
–with-gd
–enable-sockets
–with-jpeg-dir=/usr
–with-png-dir=/usr
–enable-exif
–enable-zip
–with-zlib
–with-zlib-dir=/usr
–with-kerberos
–with-openssl
–with-mcrypt=/usr
–enable-soap
–enable-xmlreader
–with-xsl
–enable-ftp
–enable-cgi
–enable-cli
–with-curl=/usr
–with-tidy
–with-xmlrpc
–enable-sysvsem
–enable-sysvshm
–enable-shmop
–with-mysql=mysqlnd
–with-mysqli=mysqlnd
–with-pdo-mysql=mysqlnd
–with-mysql-sock=/tmp/mysql.sock
–with-pdo-sqlite
–enable-pcntl
–with-readline
–enable-mbstring
–enable-mbregex
–disable-debug
–enable-bcmath
–enable-opcache
–enable-apc
–enable-apc-debug
–enable-apc-filehits

変更したい場合はこの辺りを修正するものと思われますが試してはいません

この辺が自由にカスタマイズできるようになると、Wordpressだけでなく様々なPHPを使ったプログラムにも活用できそうです

単なる利用者ですが VAW がもっと利用されるように今後も Tips 等を紹介していきたいと思います。本当にお勧めです (^^)

 


まとめ記事紹介

go-to-top