ハトネコエ Web がくしゅうちょう

プログラミングとかAndroid

PHP バージョン切り替えは phpenv だけじゃない! chphp の紹介

phpenv 使えない

phpenv に php-build を足しても phpenv install が、エラーのためにインストール完了しない。
PHP インストール出来ない!

ここを参考にしつつ
エラーメッセージに対処していったのですが、解決法がわからないコンパイルエラーに遭遇し、
どんどんイヤになってきました。

phpenv 使っている人多いから、おそらく私の環境が悪いのだとは思いますが、数時間も悪戦苦闘したりPC環境を汚染したり神経使いたくない!

chphp 使おう

で、chphp というものを見つけました。

こっちは上手くいきましたので、これの説明をします。

1. 注意

まず、注意点。
homebrew からのインストールはやめましょう

brew install chphp で chphp 入るから、これで大丈夫かと思いきや、
これには setup.sh が含まれていないために、 php-install コマンドを動かせるようになりません。

ちょっとしたハマりどころなので注意です。
Github の README に書かれているとおりにやっていきましょう。

2. chphp のインストール

wget -O chphp-0.0.1.tar.gz https://github.com/marcosdsanchez/chphp/archive/v0.0.1.tar.gz
tar -xzvf chphp-0.0.1.tar.gz
cd chphp-0.0.1/
sudo make install
sudo ./scripts/setup.sh

まず公式に書かれている通り、この順でコマンドを実行すれば chphp のセットアップが完了します。

私の場合は「zlib がありませんよ〜」と途中にエラーメッセージが出て
setup.sh が完了しませんでしたので、エラーメッセージに書かれている通り
brew install homebrew/dupes/zlib で zlib を入れて解決しました。

setup.sh の実行中、php-5.3.27 がインストールがなされ、
その後に php-5.4.21 のインストールがされようとする段階で、

>>> Successfully installed php 5.3.27 into /opt/php_versions/php-5.3.27
>>> Installing php 5.4.21 into /opt/php_versions/php-5.4.21 ...
>>> Installing dependencies for php 5.4.21 ...
Warning: curl-7.48.0 already installed
Warning: freetype-2.6.3 already installed
Warning: gettext-0.19.7 already installed
Warning: gmp-6.1.0 already installed
Warning: icu4c-56.1 already installed
Warning: imap-uw-2007f already installed
Warning: jpeg-8d already installed
Warning: libpng-1.6.21 already installed
Warning: libxml2-2.9.3 already installed
Warning: openssl-1.0.2g already installed
Warning: unixodbc-2.3.2_1 already installed
Warning: homebrew/dupes/zlib-1.2.8 already installed
>>> Downloading http://us2.php.net/get/php-5.4.21.tar.bz2/from/ar2.php.net/mirror into /usr/local/src ...
--2016-03-31 18:27:24--  http://us2.php.net/get/php-5.4.21.tar.bz2/from/ar2.php.net/mirror
Resolving us2.php.net... 64.71.164.5
Connecting to us2.php.net|64.71.164.5|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2016-03-31 18:27:25 ERROR 404: Not Found.

!!! Download of http://us2.php.net/get/php-5.4.21.tar.bz2/from/ar2.php.net/mirror failed!

このようなエラーメッセージが出て終了してしまいましたが、
もしこれを見ている方が同じような表示を見たとしても、心配いりません。
ただ単純に php-5.4.21 がレポジトリに見つからなくてダウンロードできなかっただけです。

すでに php-5.3.27 は正常に /opt/php_versions ディレクトリ(もしくは ~/.php_versions ディレクトリ )に入ったはずですし、
php-install コマンドも動作するようになっているかと思います。

ためしに、2016/3/31 現在の 5.5系の安定版を入れてみます。

php-install php 5.5.33

とコマンドすると開始されます。
インストールはけっこう時間がかかります。

終了後に、

ls /opt/php_versions
ls ~/.php_versions

のコマンドのいずれかで、php-5.5.33 が入ったことが確認できると思います。*1

3. chphp コマンドが動くようにする

ここまでではまだ chphp コマンドは動きません。
bash を使っている方(よくわからない方はたいていこっち)は ~/.bashrc 、
zsh を使っている方は ~/.zshrc に以下の1行を足す必要があります。
(私は zsh なので以降 .zshrc と書きます)

source /usr/local/share/chphp/chphp.sh

足したら、シェルを開き直すか source ~/.zshrc で zshrc を再読み込み。

f:id:nekonenene:20160331193932p:plain

このように、

chphp

と打つと現在 php-install でインストールされたPHPのバージョン一覧が表示され、

chphp 5.5.33    ## chphp {バージョン番号}

とすることでバージョンを切り替え、

chphp system

と打てば、システム標準(chphpを入れる前)のバージョンに切り替えられます。

4. auto-switching 機能

違うプロジェクト(フォルダー)で違うバージョンのPHPを使いたい場合は多いことでしょう。
プロジェクトに cd コマンドで移動したときに自動で chphp を働かせる機能もあるようです。

動作させるにはまず .zshrc に source /usr/local/share/chphp/auto.sh の一文を足します。

echo "source /usr/local/share/chphp/auto.sh" >> ~/.zshrc
source ~/.zshrc

次に、プロジェクトのフォルダーに移動し、例えば php-5.5.33 に切り替えるようにしたいのなら、

echo "php-5.5.33" > .php-version

とコマンドして、『php-5.5.33』と書かれた .php-version ファイルを作ります。

auto-switching 機能が働いてる時、
.php-version ファイルが移動したフォルダにあると、chphp が裏で働いてくれ、PHPのバージョンがチェンジされます。

f:id:nekonenene:20160331200704p:plain

なお、このとき、逆に .php-version ファイルが自分自身もしくは親フォルダに置かれていないフォルダでは、システム標準の PHP バージョンが使われます。
chphp system が裏で働く感じですね。

ですので、auto-switching 機能がすべての人に向いている機能ではない点にご注意ください。

5. ターミナル起動時のPHPバージョンを設定

ターミナル起動時に、chphp.sh により chphp system と同様のことがなされ、
必ずシステム標準のPHPバージョンに戻ってしまいます。
残念ながら前回起動時のバージョンを引き継ぐことはできません。

もし、起動時に必ず php-5.5.33 でありたい場合は、
.zshrc の 3. で記載した『source /usr/local/share/chphp/chphp.sh』以降に『chphp 5.5.33』と記載するか、
もしくは、auto-switching 機能をONにしてる場合は、

echo "php-5.5.33" > ~/.php-version

のようにユーザーディレクトリに .php-version を用意することで解決できます。(ルートディレクトリのほうがいいのかも……?)

6. インストールしたPHPバージョンのアンインストール

特に chphp-uninstall というコマンドはないようです。
ですので、
~/.php_versions ディレクトリを見て、いらないバージョンのフォルダを削除するしかなさそうです。

ターミナルを起動しなおして chphp コマンドを打てば、
そのバージョンが一覧から消えているのが確認できるかと思います。

f:id:nekonenene:20160331203658p:plain
php-5.5.5 フォルダーを削除しました。一覧に表示されなくなっています)

おわり

PHP に触れずに生きてきたのですが、
レンタルサーバでサイト構築するのをしなくてはならないので
PHP を覚え始めなくてはなりません。
CakePHP 使うの良さそう…?

lolipopPHPバージョンが 5.5.25 だったので、それに合わせて開発していくために今回の記事となりました。
がんばります。

追記 (2017/02/10)

一年前は苦労して投げ出しましたが、現在は phpenv 使えています。
一筋縄にはいきませんでしたが、ここなどが参考になります。

MavericksにphpenvでPHP5.5を入れる - IT探検記

*1:setup.sh で入るPHPが /opt/php_versions に、その後の php-install コマンドで入るPHPが ~/.php_versions に格納されるっぽい