mumumu の日記

Development, Translation, daily life, thoughts, and so on.

phpenv without php-build

https://github.com/phpenv/phpenv

来週から Python を仕事で使うというのに、未だに PHP ばかりやっている mumumu です。こんばんは。

さて、複数の PHP のバージョンをひとつのマシンに共存させ、使い分けたいと思った場合に、現在は CHH 版の phpenv が広まっているような気がする。けれども、自分は Ruby の複数バージョン共存に rbenv を使っているので、それと同じように使える phpenv/phpenv を使ってみたら思ったより便利だったので、ここで紹介する。



ここでは、Ubuntu 12.10 (Quantal Quetzal) で、Apache2 のモジュールとしてPHPを複数共存させる手順を以下に示す。まずはインストールから。

$ git clone git://github.com/phpenv/phpenv.git .phpenv
$ echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(phpenv init -)"' >> ~/.bashrc
$ . ~/.bashrc

これで完了。以下のように出れば成功である。

$ phpenv rehash
phpenv v0.0.3-dev

インストール可能なバージョンを出してみる。github の php-src をベースとしたバージョンが全てビルド可能であることが示されるはずだ。

$ phpenv install --releases
phpenv v0.0.3-dev

             init extensions  the clone source for additional extensions                      
             init  the cloning source from php-src Github repo                     
             Fetching  the latest PHP releases from Github repohpenv install --releases

PHP releases as were available on:
2013年  6月 28日 金曜日 18:49:23 JST

php-5.5.0
php-5.5.0RC1
php-5.5.0RC2
php-5.5.0RC3
php-5.5.0alpha1
php-5.5.0alpha2

...

php-5.4.17RC1
php-5.4.16

... 

PHP を Apacheモジュールとしてインストールしたことがある人なら御存知の通り、Linux での PHP のビルドには Apache モジュールをビルドするための apxs2、そして bison(re2c) 、Cコンパイラその他が必要なことは御存知な通りである。そこで、自分が必要なモノをここでインストールしておく。libcurl4, libreadlineとか、libxslt は自分がいつも設定しているモノなので正直適当である。

$ sudo apt-get install build-essential apache2-mpm-prefork apache2-prefork-dev bison re2c libxml2-dev libcurl4-openssl-dev libmcrypt-dev libreadline-dev libxslt-dev

さて、各バージョンのビルドである。ビルドオプションは各バージョンでコントロールできる。また、同じバージョンだが、ビルドオプションが違う複数のPHPをインストールすることもできる。ここでは、PHP 5.5.0 をインストールするので、それ用のオプションを設定しよう。

$ cd ~/.phpenv/etc
$ vi php-5.5.Linux.source 

自分は以下のように設定した。はっきりいって適当である。ここは適宜調整し、ビルドに必要なヘッダファイルは適宜入れてください。

あと、xdebug とかをデフォルトで入れようとしてくれるので、それはコメントアウトした。

CONFIGURE_OPTIONS="--with-apxs2=/usr/bin/apxs2
                   --enable-zend-multibyte
                   --enable-phar
                   --disable-intl
                   --with-libxml
                   --with-openssl
                   --with-kerberos=/usr
                   --with-zlib
                   --enable-mbstring
                   --enable-mbregex
                   --with-xmlrpc
                   --with-xsl
                   --with-pcre-regex
                   --with-curl
                   --with-mcrypt
                   --with-gettext
                   --with-mysql
                   --with-mysqli
                   --with-pdo-mysql
                   --with-readline
                   "

#MANUAL_EXTENSIONS=('http' 'uri-template' 'xdebug')

そしてビルドし、インストールする。 成功したら、以下のように出るはずだ。

$ phpenv install php-5.5.0

               [Fetching] |1| latest code from Github repo                                 
               [Branching] |2| for a clean build environment                                
               [Patching] |3| Applying patches to the source if any are applicable.        
               [Configuring] |4| build options for selected release                           
               [Compiling] |5| /home/mumumu/.phpenv/versions/5.5.0                          
               make: success                                                          
               make install: success                                                          
               make clean: success                                                          
               [Config ini] |6| appending add-on extention configuration to php.ini          
                   [Pyrus] |7| downloading and installing from http://pear2.php.net/pyrus.phar
               [Extensions] |8| No additional extensions configured for manual installation. 
                   Success: The installation of the php-5.5.0 release was successfully completed.
                   Info: The log files produced by the procedure are available, in the tmp folder, for your review:
                   - Any warnings or messages sent to STDERR was logged to /tmp/phpenv-install-php-5.5.0.20130628182515.log.err
                   - All messages sent to STDOUT was logged to /tmp/phpenv-install-php-5.5.0.20130628182515.log

インストールできたら、このマシンでは PHP 5.5.0 をメインで使う旨宣言する。

$ phpenv global 5.5.0
phpenv v0.0.3-dev

5.5.0
$ php --version
PHP 5.5.0 (cli) (built with phpenv v0.0.2: Jun 28 2013 18:31:35) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0-dev, Copyright (c) 1998-2013 Zend Technologies

おっ、そういえば PHP 5.5.0 からは OPcache がデフォルトでビルドされるんだった。それも組み込んでおこう。php.ini もバージョン毎に使い分けができる

$ cd ~/.phpenv/versions/5.5.0/etc/php.ini

上記に以下を書き加えよう。

zend_extension=/home/mumumu/.phpenv/versions/5.5.0/lib/php/extensions/no-debug-non-zts-20121212/opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

書き加えてバージョンを確かめると以下のようになる。

$ php --version
PHP 5.5.0 (cli) (built with phpenv v0.0.2: Jun 28 2013 18:31:35) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0-dev, Copyright (c) 1998-2013 Zend Technologies
    with Zend OPcache v7.0.2-dev, Copyright (c) 1999-2013, by Zend Technologie

Apache モジュールも入っている。これは各バージョンの libexec ディレクトリ以下に入っているので、それを httpd.conf で切り替えれば Apache でのバージョンの切り替えも可能だ。

$ ls ~/.phpenv/versions/5.5.0/libexec
libphp5.so

次に、PHP 5.5.0 をデバッグビルドして共存させてみる。ビルドの設定ファイルをコピーし、設定すればよいのだが、設定ファイルは <php major release>-<optional specific build>.<platform>.source という規約に従う必要がある。

ここでは、PHP 5.5.0 のデバッグ版であることを示すために、optional specific build の部分を 550debug としている。ここでは、–enable-debug をオプションに加える。

$ cd ~/.phpenv/etc/
$ cp php-5.5.Linux.source php-5.5-550debug.Linux.source

そしてインストールする。optional specific build をオプションとして指定し、さっき編集した設定ファイルが使われていることを確かめよう。

$ phpenv install php-5.5.0 550debug
phpenv v0.0.3-dev

Building 5.5.0-550debug with config options from: php-5.5-550debug.Linux.source
....

ビルドが終わると、ふたつのバージョンが入っていることがわかる。

$ phpenv versions
phpenv v0.0.3-dev

* 5.5.0 (set by /home/mumumu/.phpenv/version)
  5.5.0-550debug

最後に、5.5.0 のデバッグ版に切り替え、コンパイルオプションを確かめる。–enable-debug が加わっていること、デバッグ版としてバージョンが出ていることがわかる。

$ phpenv local 5.5.0-550debug
$ php --version
PHP 5.5.0 (cli) (built with phpenv v0.0.2: Jun 28 2013 19:27:20) (DEBUG)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0-dev, Copyright (c) 1998-2013 Zend Technologies
$ php -i | grep configure
Configure Command =>  './configure'  '--with-apxs2=/usr/bin/apxs2' '--enable-zend-multibyte' '--enable-phar' '--disable-intl' '--with-libxml' '--with-openssl' '--with-kerberos=/usr' '--with-zlib' '--enable-mbstring' '--enable-mbregex' '--with-xmlrpc' '--with-xsl' '--with-pcre-regex' '--with-curl' '--with-mcrypt' '--with-gettext' '--with-mysql' '--with-mysqli' '--with-pdo-mysql' '--with-readline' '--enable-debug' '--with-config-file-path=/home/mumumu/.phpenv/versions/5.5.0-550debug/etc' '--with-config-file-scan-dir=/home/mumumu/.phpenv/versions/5.5.0-550debug/etc/conf.d' '--prefix=/home/mumumu/.phpenv/versions/5.5.0-550debug'


こんな感じだ。自分の中では rbenv と同じ感じで使えて、Apache モジュールの切り替えもうまいこといったのでいい感じである。また、同じバージョンで複数のビルドも共存できる。使っていて楽しい。