brew の場合は楽そうなかんじなのに、Ubuntu だとわりと手間取った。
Ubuntu で phpenv 入れてる詳しい説明は少なそうだったので、同じところでつまづいてる人用に共有してみます。
基本的にデザインとフロント担当なのでお前は何を言っているんだ的なところがあったら教えてください。
やりたいこと
- 手軽に PHP のバージョンを切り替える開発環境を作りたい
- 引き継いだレガシー案件に古いPHPバージョン依存のコードがあったので
Install
1. Install phpenv
PHPのバージョン切り替えたりするやつです。
# Install phpenv
$ cd ~
$ git clone https://github.com/CHH/phpenv.git ~/.phpenv
$ sh ~/.phpenv/bin/phpenv-install.sh
2. Install php-build
PHPビルドするやつです。
# Install php-build
$ git clone git://github.com/CHH/php-build.git
$ cd php-build/
$ sudo paco -D sh install.sh # paco を好みで使う
$ which php-build
/usr/local/bin/php-build
$ rm -rf php-build
php-build インストール時にどこにどんなファイルが配置されたか記録しておくために、paco を使っています。使っても使わなくてもいいやつです。
3. path 設定
# rbenv & phpenv
# .rbenv ディレクトリが home にあればパスを通す
# phpenv は rbenv を内部利用しているので先に rbenv に PATH を通す
if [ -d $HOME/.rbenv/bin ]; then
export PATH="$PATH:$HOME/.rbenv/bin"
eval "$(rbenv init -)"
if [ -d $HOME/.phpenv/bin ]; then
export PATH="$PATH:$HOME/.rbenv/bin:$HOME/.phpenv/bin"
eval "$(phpenv init -)"
fi
fi
php-build で PHP をビルドする
1. インストール可能なバージョン一覧の表示
$ php-build --definitions
5.2.17
5.3.10
5.3.11
:
5.5.0beta1
5.5.0beta2
5.5snapshot
2. 依存パッケージのインストール
PHPビルド時にパッケージが足りないようなので、トライアンドエラーで、言われるままに大量にインストールする。
- libcurl4-gnutls-dev
- libcurl4-nss-dev
- libcurl4-gnutls-dev
- libpng3 libjpeg-dev
- re2c
- libxml2-dev
- openssl-dev
- libtidy-dev
- libxslt-dev
- libmcrypt-dev
- libreadline-dev
今回は上のリストを全てインストール。
$ sudo aptitude install libcurl4-gnutls-dev libcurl4-nss-dev libcurl4-gnutls-dev libpng3 libjpeg-dev re2c libxml2-dev openssl-dev libtidy-dev libxslt-dev libmcrypt-dev libreadline-dev
3. apxs2 の用意
debian/ubuntu の場合、 さらに apxs2
コマンドを使えるようにしておかないと、
PHPビルド時に libphp5.so
を作成できないぽいので入れる。
$ apache2 -V
Server version: Apache/2.2.22 (Ubuntu)
:
Server MPM: Prefork
:
Server MPM
の値が Prefork
だった場合、apache2-prefork-dev
、
worker
の場合、apache2-threaded-dev
が必要。
$ sudo aptitude install apache2-prefork-dev
PHPビルド時の設定に libphp5.so
を作成するオプションを追記。
default_configure_options
に --enable-fpm
がある場合は削除しておく。
このあたりは、CLI版, CGI版 どちらでビルドするかで変わるぽい。
$ which apxs2
/usr/bin/apxs2
$ sudo vim /usr/local/share/php-build/default_configure_options
:
--with-apxs2=--with-apxs2=/usr/bin/apxs2 # << 追記
4. libphp5.so のバックアップ
PHPビルド時に、libphp5.so
が上書きされるため、現在のバージョンのものをバックアップする。
$ mkdir ~/.phpenv/versions/CURRENT_PHP_VER/
$ mv /usr/lib/apache2/modules/libphp5.so ~/.phpenv/versions/CURRENT_PHP_VER/
5. PHP のビルド, インストール
phpenv で管理できるようにするため、~/.phpenv/versions
をインストール先として
指定する。
$ php-build 5.3.19 ~/.phpenv/versions/5.3.19
[Info]: Loaded apc Plugin.
[Info]: Loaded pyrus Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 5.3.19 into /home/qurage/.phpenv/versions/5.3.19
[Skipping]: Already downloaded and extracted http://downloads.php.net/johannes/php-5.3.19.tar.bz2
[Preparing]: /tmp/php-build/source/5.3.19
[Compiling]: /tmp/php-build/source/5.3.19
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /home/qurage/.phpenv/versions/5.3.19/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.1.tgz
[XDebug]: Compiling in /tmp/php-build/source/xdebug-2.2.1
[XDebug]: Installing XDebug configuration in /home/qurage/.phpenv/versions/5.3.19/etc/conf.d/xdebug.ini
[XDebug]: Cleaning up.
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.5.3.19.20130409111047.log
[Success]: Built 5.3.19 successfully.
phpenv からビルドしたPHPが正しく認識されているか確認。
$ phpenv versions
* system (set by /home/qurage/.phpenv/version)
5.3.19
libphp5.so
はPHPをビルドするたびに上書きされるため、
バージョンごとに移動・保存しておく。
$ sudo cp /usr/lib/apache2/modules/libphp5.so ~/.phpenv/versions/5.3.19/
PHP バージョン切り替え
$ phpenv global 5.3.19
$ phpenv versions
system
* 5.3.19 (set by /home/qurage/.php-version)
$ phpenv rehash
Apache 側の設定
phpenv でバージョン切り替えしただけでは、Apache 側には未適用なので、phpenv-apache-version プラグインを利用する。
$ git clone https://github.com/garamon/phpenv-apache-version .phpenv/plugins/phpenv-apache-version/
$ sudo /home/qurage/.phpenv/bin/phpenv apache-version 5.3.19
phpinfo(); などで Apache 側の動作確認。
php.ini 設定
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo
:
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
; http://php.net/pdo_mysql.default-socket
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
:
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysql.default-socket
mysql.default_socket = /var/run/mysqld/mysqld.sock
:
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysqli.default-socket
mysqli.default_socket = /var/run/mysqld/mysqld.sock
mysql の socket パスは適宜変更する必要がある。
- Ubuntu ⇒ /var/run/mysqld/mysqld.sock
- CentOS ⇒ /tmp/mysql.sock
あとがき
なかなか大変でした。