モダンなPHP開発環境を構築する

phpenv + php-build で 複数のPHPバージョンを管理する

モダンなPHP開発環境を構築する

仮想マシンごとに異なるバージョンのPHPをインストールして動作させていたのですが、面倒くさくなったので、phpenv と php-build を利用して一つの仮想マシン上に複数のPHPをインストールして切り替えて利用する環境を構築します。

phpenv と php-build を利用した環境構築は他の方々がブログで書かれていますので、あくまで備忘録的なメモです。

環境

インストールされているもの

CentOS release 5.8
Apache/2.2.3 (RPM)
MySQL 5.5.25 (RPM)

インストールするもの

phpenv
php-build
PHP 5.4.4 (ソース)
PHP 5.3.14 (ソース)
PHP 5.2.17 (ソース)

phpenvとは

phpenv

PHPバージョン切り替えツール。
コマンドから、バージョン指定するだけで簡単切り替え!
複数のPHPのバージョンで動作確認等したい場合、重宝しそうです。

phpenvのインストール

gitコマンドがない!って方は、epelリポジトリを追加すれば yumでインストールすることができます。

git clone https://github.com/CHH/phpenv.git
cd phpenv/bin
sh phpenv-install.sh

Installing phpenv in /root/.phpenv
remote: Counting objects: 1040, done.
remote: Compressing objects: 100% (421/421), done.
remote: Total 1040 (delta 650), reused 958 (delta 591)
Receiving objects: 100% (1040/1040), 138.37 KiB | 135 KiB/s, done.
Resolving deltas: 100% (650/650), done.
Success.

Now add /root/.phpenv/bin to your $PATH, add "eval $(phpenv init -)" at the end of your ~/.bashrc and restart your shell to use phpenv.

インストールが完了したら、メッセージに従ってパスの追加を行います。

bashrcの編集

~/.bashrc に以下を追加。

PATH=$HOME/.phpenv/bin:$PATH
eval "$(phpenv init -)"

設定を追加したら反映させます。

source ~/.bashrc

これで、phpenvのインストールが完了しました。
コマンドで「phpenv」と入力して確認してください。

php-buildとは

php-build

コマンドで、ソースのダウンロード&展開&コンパイル&インストールを行なってくれます。
定義ファイルを編集することで、オプションを指定することも可能です。

php-build のインストール

git clone https://github.com/CHH/php-build.git
cd php-build/
sh install.sh

「php-build」と入力してインストールされているか確認してください。

PHPのインストール

先程、インストールした php-build を利用して PHPのインストールを行います。
まずは、以下のコマンドでインストール可能なバージョンを確認します。

php-build --definitions

5.2.17
5.3.10
5.3.11
5.3.11RC1
5.3.11RC2
5.3.12
5.3.13
5.3.14
5.3.2
5.3.3
5.3.6
5.3.8
5.3.9
5.3.9RC3
5.3.9RC4
5.3snapshot
5.4.0
5.4.0RC1
5.4.0RC2
5.4.0RC3
5.4.0RC4
5.4.0RC5
5.4.0RC6
5.4.0RC7
5.4.0RC8
5.4.0alpha3
5.4.0beta1
5.4.0beta2
5.4.1
5.4.1RC1
5.4.1RC2
5.4.2
5.4.3
5.4.4
5.4snapshot

今回は、PHP 5.4.4 、PHP 5.3.14、PHP 5.2.17をインストールします。

PHP 5.4.4のインストール

依存関係の問題で、エラーが大量に出ます。以下のパッケージをインストールしておけばコンパイルは通るはずです。通らない場合は、必要なパッケージをインストールして下さい。

依存パッケージのインストール

yum install --enablerepo=rpmforge re2c
yum install libxml2-devel bison bison-devel openssl-devel curl-devel libjpeg-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel

定義ファイルの編集

デフォルトの設定ではApacheモジュールが生成されないので、定義ファイルの編集を行います。定義ファイルの編集はPHP 5.3.14 PHP 5.2.17 共に行います。

vi /usr/local/share/php-build/definitions/5.4.4
configure_option "--with-apxs2" "/usr/sbin/apxs" ←追加
install_package "http://www.php.net/distributions/php-5.4.4.tar.bz2"
install_pyrus
install_xdebug "2.2.0"

インストール & モジュールの退避

php-build 5.4.4 ~/.phpenv/versions/5.4.4
mv /etc/httpd/modules/libphp5.so ~/.phpenv/versions/5.4.4/

PHP 5.3.14 のインストール

定義ファイルの編集

vi /usr/local/share/php-build/definitions/5.3.14
configure_option "--with-apxs2" "/usr/sbin/apxs" ←追加
install_package "http://www.php.net/distributions/php-5.3.14.tar.bz2"
install_pyrus
install_xdebug "2.2.0"

インストール & モジュールの退避

php-build 5.3.14 ~/.phpenv/versions/5.3.14
mv /etc/httpd/modules/libphp5.so ~/.phpenv/versions/5.3.14/

エラーが発生する場合

家の環境でも構築してみたら、make時に以下のエラーが発生していました。

/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [libphp5.la] エラー 1

lltdlがないよ!って怒られているので、yumで libtool-ltdlをインストールしてあげれば makeが通るようになります。

yum install libtool-ltdl libtool-ltdl-devel

PHP 5.2.17 のインストール

依存パッケージのインストール

yum install flex
yum --enablerepo=remi,epel install mysql-devel

定義ファイルの編集

vi /usr/local/share/php-build/definitions/5.2.17

configure_option "--with-apxs2" "/usr/sbin/apxs" ←追加
configure_option "--enable-fastcgi"

configure_option -R "--with-mysql"
configure_option -R "--with-mysqli"
configure_option -R "--with-pdo-mysql"

with_pear

install_package "http://museum.php.net/php5/php-5.2.17.tar.bz2"
install_xdebug "2.2.0"

インストール & モジュールの退避

確認の為、移動ではなくコピーしておきます。

php-build 5.2.17 ~/.phpenv/versions/5.2.17
cp /etc/httpd/modules/libphp5.so ~/.phpenv/versions/5.2.17/

これで PHP のインストールとモジュールの作成は完了しました。次にApacheの設定を行います。

Apacheの設定

httpd.confの設定

httpd.confは素の状態から、あまり触りたくないのでPHP用の設定は外に出します。この辺は正直好みです。

vi /etc/httpd/conf/httpd.conf

# 206行目あたり
#LoadModule php5_module        /usr/lib/httpd/modules/libphp5.so  ← コメントアウト

php.confの作成

/etc/httpd/conf.d/ 以下に php.confを作成し、以下の内容を入力します。

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

#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#

LoadModule php5_module modules/libphp5.so

#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

確認用ページの作成

echo "<?php phpinfo(); ?>" > /var/www/html/index.php

apacheを再起動して確認してみます。

もっと慎重にやりたいって方は、PHPをインストールする前に確認用ページを作成し、それぞれのPHPインストール後にApcheの再起動 & 確認を行えばいいと思います。

phpenv で PHPのバージョンを切り替える

以下のコマンドで PHPのバージョンを切り替えます。phpenvには色々サブコマンドがあるのでそこは各自調べて下さい。

phpenv global 5.4.4
php -v

PHP 5.4.4 (cli) (built: Jun 26 2012 08:30:18)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans

簡単!

PHPを認識しない場合

上記のコマンドを入力しても phpコマンドがないよって怒られる場合、以下のコマンドを入力してください。

phpenv rehash

MySQL ソケットファイルパスの変更

7/5 修正
ソースからインストールした PHPと RPMからインストールした MySQLでは、お互いに示すソケットファイルパスが異なるのでシンボリックリンクを貼ります。

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

Apache切り替えスクリプトの作成

phpenvは phpモジュールの切り替えは行なってくれません。いちいちコピーするのも面倒くさい。

phpenv の元になっている rbenv にはプラグインという機能があり, 専用のディレクトリにシェルスクリプトを配置するだけで簡単にサブコマンドを登録できる

引用元: 第57回PHP勉強会@東京で開発環境構築について話して来た

phpenvを利用しようと思ったのはこの機能があったからってのがあります。面白そうだし。

ということで、rbenv-globalをパクリつつモジュール切り替えスクリプトを作ってみましたが、正直シェルスクリプト自信なし!

追記 2013/03/11

apache-versionスクリプトが思いの外、使われ始めてきたので修正しました。
修正したコードはgithubにあげてありますのでこちらを利用してください。

phpenv-apache-version

CentOSかRedHat系 + Mac OS X では動作します。たぶん...

vi .phpenv/libexec/rbenv-apache-version

#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x

# Provide rbenv completions
if [ "$1" = "--complete" ]; then
  echo system
  exec rbenv-versions --bare
fi

RBENV_VERSION="$1"
APACHE_ROOT="/etc/httpd"
APACHE_MODULE_PATH="${APACHE_ROOT}/modules"

# Make sure the specified version is installed.

RBENV_PREFIX_PATH="${RBENV_ROOT}/versions/${RBENV_VERSION}"
if [ ! -d "$RBENV_PREFIX_PATH" ]; then
  echo "rbenv: version \`${RBENV_VERSION}' not installed" >&2
  exit 1
fi

PHP_MODULE_PATH="$RBENV_PREFIX_PATH/libphp5.so"

if [ ! -f "$PHP_MODULE_PATH" ]; then
  echo "apache module not found \'${PHP_MODULE_PATH}'" >&2
  exit 1
fi

if [ ! -d "$APACHE_MODULE_PATH" ]; then
  echo "Directory not found \'${APACHE_MODULE_PATH}'" >&2
  exit 1
fi

echo "copy ${PHP_MODULE_PATH} to ${APACHE_MODULE_PATH}"
cp "$PHP_MODULE_PATH" "$APACHE_MODULE_PATH"

echo "Restarting apache..."
service httpd restart

実行権限付与

作成したら実行権限を与えます。

chmod +x .phpenv/libexec/rbenv-apache-version

使い方

サブコマンドのglobalと変わりません。
$HOME/.phpenv/versions/$PHP_VERSION 以下に 「libphp5.so」が存在する場合、Apacheのモジュールディレクリにコピーを行い、Apacheの再起動を行います。

phpenv apache-version 5.4.4

Copy /root/.phpenv/versions/5.4.4/libphp5.so to /etc/httpd/modules
Restarting apache...
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

反映されているか確認。

問題なさそうですね。globalとモジュール切り替えスクリプト一緒にした方がよかったかも。この辺りはまた直すとしてとりあえず動いてるのでよしとします。

これでモダンな PHP開発環境の構築ができました。正直モダンかどうかは知りませんので悪しからず。というかモダンって死語。。。

参考

phpenv で複数の PHP 環境を管理する
phpenv+php-build+pyrusでの複数バージョンPHP管理など
PHPerがMacbookAirを買ったら直ぐにすること 2012

トラックバック

TRACKBACK&PING

TrackBack URL :

コメントを残す

メールアドレスが公開されることはありません。