PHPのバージョン管理ツールにはphpenvやphpbrewがありますが、環境によってビルドエラーが発生しやすく、設定も煩雑です。
筆者も試行錯誤してきましたが、最終的にHomebrewでインストールし必要に応じて切り替えるのが安定しているという結論に至りました。
miseでの導入も検討しましたが、phpに関しては拡張機能(mbstring, gd, openssl等)の依存関係が多く、それらは事前にHomebrewなどでインストールする必要があるためmiseで完結しておらずセットアップする手間がメリットに見合いません。
とはいえプロジェクト毎に自動でバージョンを切り替えたいというニーズもあると思いますので、「基本はHomebrewで管理しつつ、必要に応じてmiseでHomebrewのphpをバージョンが切り替えられる」といういいとこ取りの設定を解説します。
miseそのものに関してはこちらの記事をご覧ください。
なお、PHP以外でもHomebrewでバージョン指定しているものなら同様に切り替えできます。
初期設定
前提として、利用するPHPバージョンをHomebrewでインストールしている必要があります。
# 例:PHP 8.4 と 8.5 をインストールする場合
$ brew install [email protected]
$ brew install [email protected]次に.zshrcにパス設定を追記します。(※後述のmiseでの管理をする場合は飛ばしてください)
export PATH="$(brew --prefix php)/bin:$PATH"追記したら $ source ~/.zshrc で反映します。php -vで確認し、もし反映できていない場合は一度ターミナルを再起動してください。
バージョンの切り替え方法
PHPのバージョン切り替えはunlinkで現在のリンクを解除し、linkで新しく紐づけます。
# 例: php8.4に切り替えなら
$ brew unlink php && brew link --overwrite [email protected]--overwriteがないと、バージョン指定無しのphpに切り替えた場合などエラーが出る場合があります。
特定の状況で切り替えエラーが発生してやや面倒な状態になるのでunlinkもセットで行うことでトラブルを未然に防いでおきましょう。
おまけ: miseでHomebrewのphpを切り替える
とはいえやはりmiseでディレクトリ(プロジェクト)毎に自動的にバージョンを切り替えたい!
という場合、少し強引な手法ですが直接$PATHを通す方法があります。
[env]
# Homebrewのバージョン指定PHPのPATHを優先的に追加 なければシステムのPHPが呼ばれるので注意
_.path = "/opt/homebrew/opt/[email protected]/bin"設定後、パスが通っているか確認します。
% which php
/opt/homebrew/opt/[email protected]/bin/phpとなっていれば設定できています。
もしならない場合は% ls -la /opt/homebrew/opt/[email protected]を実行し、Homebrewでインストールされていてディレクトリがあるかを確認するのとターミナルを再起動してください。
何をしているか?
$PATHにHomebrewで入れたバージョン指定のディレクトリを追加して優先的に読ませています。
ただし、これはあくまで優先パスに追加しているだけです。
mise use時の挙動とは異なり、自動インストールはされません。事前にHomebrewでインストールする必要があります。
さらに、指定のディレクトリがない場合はシステムのphpが呼ばれるので「実は他のバージョンのphpが動いていた」ということが発生しえます。
特に、Intel Macだとパスが異なるため、チームで共有する場合は注意が必要です。