Help us understand the problem. What is going on with this article?

phpenvの導入して複数バージョンのPHPを管理する

More than 5 years have passed since last update.

phpenvとは

複数のバージョンのPHPを管理するツール。
Rubyで使われているrbenvを基にして作成されているようだ(ところどころ名残がある)。

phpenvのインストール

以下のコマンドで、phpenvをインストール。

$ curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
$ git clone git://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
$ echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(phpenv init -)"' >> ~/.bashrc
$ exec $SHELL -l

完了すると、phpenvコマンドが使用できる。

PHPのインストール

以下のコマンドで、PHPのバージョンが確認できる。

$ phpenv install -l

現状、バージョン番号が文字ソートになっているようで、
以下のような並びになっているので注意。

 5.5.1
 5.5.10
 5.5.11
 5.5.12
 5.5.2

例えば、5.5.12をインストールする場合は、
以下のようなコマンドで行う。

$ phpenv install 5.5.12
$ CFLAGS="-g" phpenv install 5.5.12 # コンパイラにオプションを渡す場合

コンパイル時のオプションは、以下のファイルに記載されている。

# デフォルトのオプション
$HOME/.phpenv/plugins/php-build/share/php-build/default_configure_options

# 各バージョンごとの設定
$HOME/.phpenv/plugins/php-build/share/php-build/definitions/5.5.12

オプションなどを変えたいときは、これらのファイルを編集する。

以下のような記述で、バージョンごとにオプションを変更できる。

# オプションを追加する
configure_option "--enable-pcntl"

# オプションを外す
configure_option -D "--with-mysqli"

configure_optionをファイルの一番下に記述したら、
反映されなかったことがあったので、
一番上に記述した方が良いかもしれない。

バージョンを切り替える

以下のコマンドでインストールされているバージョンを確認することができる。

$ phpenv versions
* system (set by /home/uchiko/.phpenv/version)
  5.5.10
  5.5.11
  5.5.7
  5.5.8

以下のコマンドでバージョンを切り替えることができる。

$ phpenv global {version} # 全ディレクトリで使うバージョン
$ phpenv local {version} # カレントディレクトリのみで使うバージョン(.php-versionが作成される)

Apacheとの連携

PHPをインストールするときに、
以下のconfigureオプションを追加する。

configure_option "--with-apxs2" "/usr/local/apache2/bin/apxs"

apxsへのパスは環境依存。以下のコマンドでパスがわかる。

$ which apxs

インストールされていなかったり、PATHが通っていなかったりすると、
のちに適用するパッチがうまく動作しないので、PATHは通す必要がある。

このオプションを追加してインストールすると、
libphp5.soが作成されるのだが、
Apacheのmodulesディレクトリに入れようとしてくるので、
パーミッションエラーが起こる。

この問題に対処するため、
PHPのMakefileで指定されているlibphp5.soの出力場所を、
書き換えるためのパッチをphp-buildに当てた。

$ wget https://gist.githubusercontent.com/memememomo/91f774b1e41b24f99e1e/raw/fe57f9936dae16c5ab186919c1611c8f6a4b1fbc/php-build.patch
$ patch -u $HOME/.phpenv/plugins/php-build/bin/php-build < php-build.patch

パッチは以下の記事で紹介されているものを基にしている。
http://tkuchiki.hatenablog.com/entry/2014/04/08/210022

このパッチを当てた後にPHPをインストールすると、
以下のディレクトリにlibphp5.soが出力される。

$HOME/.phpenv/versions/{version}/libexec/libphp5.so

あとは、modulesにシンボリックを張って、
httpd.confを編集して、Apacheを再起動するとPHPが有効になる。

$ sudo ln -s $HOME/.phpenv/versions/{version}/libexec/libphp5.so /usr/local/apache2/modules/

PHPの設定をしていない場合は、
以下の2行をhttpd.confの適切な場所に追記する。

LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php

Apacheのリスタート。

$ sudo /usr/local/apache2/bin/apachectl restart

PHPが有効になる。

シンボリックリンクなどをうまく使えば、
Apacheで使うPHPの切り替えもスムーズにできる予感。

参考

phpenv+php-build環境の構築と運用
http://d.hatena.ne.jp/hnw/20120828

php-build が libphp5.so を上書きしないようにするパッチ
http://tkuchiki.hatenablog.com/entry/2014/04/08/210022

uchiko
エンジニアです。最近はAWSでサーバレス開発しています。 Go/AWS/Docker/TypeScript/Processing。AWS認定システムアーキテクトプロフェッショナル保持。全社員フルリモートワークの会社で働いています。愛知県岡崎市在住。 Twitter: @memememomo
https://github.com/memememomo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away