Macにてphpenvを利用してPHPのバージョンを切り替える
概要
プロジェクト毎にPHPのバージョンを切り替えることが多くなってきたので、phpenv(とphp-build)を導入しました。
この記事では、MacにてphpenvでPHPのバージョンを切り替える手順を紹介いたします。
ビルドしたPHPのバージョンは以下のバージョンです。
- 7.4.20
- 8.0.7
- 8.1.12
なお、phpenv-installerというphpenv + php-buildをインストールできるツールがありますが、今回の手順では利用していません。
環境
macOSで、Homebrew が導入されていることを前提としています。
(Linuxでもできると思います。)
また、zshを使っているので、パスを通す先がzshとなっています。
bashの場合は、適宜、読み替えてください。
今回の環境
- OS : macOS Ventura (ver 13.0.1)
- Homebrew : 3.6.14
導入手順
phpenv の導入
PHPのバージョンをプロジェクト毎に切り替えられるようにするため、phpenv を導入します。
以下の導入手順は、基本的に公式の手順に則った手順となっています。
# phpenvをクローン
$ git clone git@github.com:phpenv/phpenv.git ~/.phpenv
# phpenvのパスを通す
$ echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.zshrc
# phpenvでPHPのバージョンを切り替えられるようにするために"phpenv init"をシェルに追加
$ echo 'eval "$(phpenv init -)"' >> ~/.zshrc
# .zshrcを再読み込み
$ source ~/.zshrc
phpenvのバージョン確認を実行し、バージョンが表示されればインストールは完了です。
# phpenvのバージョンを確認
$ phpenv --version
phpenv v0.9.0-rc.1
phpbuild の導入
PHPをバージョンごとにビルドするため、phpbuild を導入します。
こちらも公式の手順で導入します。
# php-buildをクローン
$ git clone https://github.com/php-build/php-build.git $HOME/.phpenv/plugins/php-build
PHP のビルドに必要なライブラリのインストール
PHPのビルドに必要なライブラリを Homebrewでインストールします。
# パッケージ インストール
$ brew install bison re2c libxml2 zlib libzip bzip2 libiconv libedit libpng libjpeg pkg-config krb5 openssl openssl@1.1 icu4c oniguruma tidy-html5
それから、ビルド時に以下エラーが発生する場合があるため、autoconf
をインストールします。
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
$ brew install autoconf
phpenvでPHPの各バージョンをインストール
インストール可能なバージョンを表示
# インストール可能なバージョンを確認
$ phpenv install --list
Available versions:
5.2.17
5.3.10
・・・
8.1.9
8.1snapshot
8.2snapshot
エラーの内容(抜粋)
/usr/local/Cellar/icu4c/71.1/include/unicode/brkiter.h:127:18: note: overridden virtual function is here
virtual bool operator==(const BreakIterator&) const = 0;
~~~~ ^
In file included from /var/tmp/php-build/source/8.0.7/ext/intl/breakiterator/codepointiterator_internal.cpp:15:
/var/tmp/php-build/source/8.0.7/ext/intl/breakiterator/codepointiterator_internal.h:40:17: error: virtual function 'operator==' has a different return type ('UBool' (aka 'signed char')) than the function it overrides (which has return type 'bool')
virtual UBool operator==(const BreakIterator& that) const;
~~~~~ ^
/usr/local/Cellar/icu4c/71.1/include/unicode/brkiter.h:127:18: note: overridden virtual function is here
virtual bool operator==(const BreakIterator&) const = 0;
~~~~ ^
1 error generated.
make: *** [ext/intl/breakiterator/breakiterator_methods.lo] Error 1
1 error generated.
make: *** [ext/intl/breakiterator/codepointiterator_internal.lo] Error 1
icu4cの問題を解決しつつ、PHP8.0以前のバージョンをビルドする
icu4cのバージョンを変更してインストールする
調べてみると、バージョン70以降でビルド時に問題が起こるようです。
2022/12/7時点では、71.1になっていました。
$ brew info icu4c
==> icu4c: stable 71.1 (bottled) [keg-only]
なので、70よりも前に戻してみます。
# Formulaディレクトリに移動
$ cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
# icu4cのコミットログを確認
$ git log --oneline icu4c.rb
e3317b86c11 icu4c: update 71.1 bottle.
54fb3277728 icu4c: update 71.1 bottle.
c013b416f31 icu4c: update homepage url
97427b4fde6 icu4c: update 71.1 bottle.
9010e85a7cb icu4c 71.1
fe6a2fe48c2 icu4c: update homepage
aa997d1c221 icu4c 70.1
c278d3dc42a icu4c: update 69.1 bottle. ← ここまで戻す
9168b74bdd5 icu4c: update 69.1 bottle.
2bab377b7b1 icu4c: update 69.1 bottle.
1c0072ae993 icu4c: update 69.1 bottle.
# 69.1にチェックアウト
$ git checkout c278d3dc42a icu4c.rb
# icu4cを再インストール
$ brew reinstall icu4c
バージョンが戻ったことを確認します。
# バージョンの確認
$ brew info icu4c
==> icu4c: stable 69.1 (bottled) [keg-only]
PHP 7.4 をビルドする
# PHP 7.4.20 をビルド
PKG_CONFIG_PATH="$(brew --prefix libjpeg)/lib/pkgconfig:$(brew --prefix openssl@1.1)/lib/pkgconfig" \
PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)" \
phpenv install 7.4.20
PHP 8.0 をビルドする
# PHP 8.0.7 をビルド
$ PKG_CONFIG_PATH="$(brew --prefix libjpeg)/lib/pkgconfig:$(brew --prefix openssl@1.1)/lib/pkgconfig" \
PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)" \
phpenv install 8.0.7
icu4cのバージョンを元に戻す
icu4cのバージョンを戻す場合の手順です。
# Formulaディレクトリに移動
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
# icu4cのコミットを最新に戻す
$ git restore --staged icu4c.rb && git checkout icu4c.rb
# icu4cを再インストール
$ brew reinstall icu4c
バージョンが最新に戻ったことを確認します。
# バージョンの確認
$ brew info icu4c
==> icu4c: stable 71.1 (bottled) [keg-only]
PHP 8.1 をビルドする
# PHP 8.1.12 をビルド
$ PKG_CONFIG_PATH="$(brew --prefix libjpeg)/lib/pkgconfig:$(brew --prefix openssl@1.1)/lib/pkgconfig" \
PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)" \
phpenv install 8.1.12
phpenv で切り替え可能なバージョン一覧の表示
$ phpenv versions
* system (set by /Users/takorice/.phpenv/version)
7.4.20
7.4.8
8.0.7
8.1.12
バージョン切り替え手順
Mac全体のPHPのバージョンを指定する
Mac全体のPHPのバージョンを指定する手順です。
ここでは、MacにインストールされているPHPのバージョンに指定する手順を記載します。
# Macで設定されているPHPのバージョンを確認
$ php -v
PHP 7.4.14 (cli) (built: Jan 5 2021 14:30:27) ( NTS )
Mac にインストールされているバージョンに指定する場合は、 system
を指定します。
phpenv でビルド済みのバージョンを使用する場合は、 system
の代わりにバージョンを指定してください。
# プロジェクトの php のバージョンを システムで設定されているバージョンに指定
$ phpenv global system
# phpenv で設定されているバージョンを確認
$ phpenv version
system (set by /Users/takorice/.phpenv/version)
# php のバージョンを確認
$ php -v
PHP 7.4.14 (cli) (built: Jan 5 2021 14:30:27) ( NTS )
プロジェクト毎に php のバージョンを変更する
プロジェクト毎の PHP のバージョンを指定する手順です。
プロジェクトのディレクトリへ移動後、以下の手順で変更してください。
なお、手順実施後に .php-version ファイルが出来上がるので、.gitignore に入れておくと良いです。
# プロジェクトの php のバージョンを 8.0.7 に指定
$ phpenv local 8.0.7
# phpenv で設定されているバージョンを確認
$ phpenv version
8.0.7 (set by /Users/takorice/dev/hogehoge/.php-version)
# php のバージョンを確認
$ php -v
PHP 8.0.7 (cli) (built: Jun 16 2021 11:41:13) ( NTS )
phpenvでビルド済みのバージョンをアンインストール
以下は、PHP 8.0.7をアンイストールする手順です。
$ phpenv uninstall 8.0.7
Discussion