🐪

Macにてphpenvを利用してPHPのバージョンを切り替える

2021/08/03に公開

概要

プロジェクト毎に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