Macにインストールされた複数のバージョンのPHPを切り替えて使う方法を解説します。
- Mac mini (M1, 2020)
- macOS Monterey
- Homebrew 3.4.2
PHPコマンドの切り替え
すでにHomebrewで複数のバージョンのPHPをインストール済みということで話を進めます。php@8.0 から php@7.4 に切り替えるには次のようにします。
% brew unlink php@8.0
Unlinking /opt/homebrew/Cellar/php/8.0.17... 24 symlinks removed.
% brew link php@7.4
Linking /opt/homebrew/Cellar/php@7.4/7.4.28_1... 25 symlinks created.
If you need to have this software first in your PATH instead consider running:
echo 'export PATH="/opt/homebrew/opt/php@7.4/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/opt/homebrew/opt/php@7.4/sbin:$PATH"' >> ~/.zshrc
php@8.0 を unlink
し、 php@7.4 を link
しました。これでコマンドラインで使うPHPの切り替えは完了しました。
PATHを通す方法が案内されていますが、無視して大丈夫です。HomebrewのインストールのときにPATHを通しているので。
何をしたのか
/opt/homebrew/bin
の中を見ると次のようになっています。
% ls -l /opt/homebrew/bin
...
lrwxr-xr-x 1 user admin 35 3 20 02:31 phar -> ../Cellar/php@7.4/7.4.28_1/bin/phar
lrwxr-xr-x 1 user admin 40 3 20 02:31 phar.phar -> ../Cellar/php@7.4/7.4.28_1/bin/phar.phar
lrwxr-xr-x 1 user admin 34 3 20 02:31 php -> ../Cellar/php@7.4/7.4.28_1/bin/php
lrwxr-xr-x 1 user admin 38 3 20 02:31 php-cgi -> ../Cellar/php@7.4/7.4.28_1/bin/php-cgi
lrwxr-xr-x 1 user admin 41 3 20 02:31 php-config -> ../Cellar/php@7.4/7.4.28_1/bin/php-config
lrwxr-xr-x 1 user admin 37 3 20 02:31 phpdbg -> ../Cellar/php@7.4/7.4.28_1/bin/phpdbg
lrwxr-xr-x 1 user admin 37 3 20 02:31 phpize -> ../Cellar/php@7.4/7.4.28_1/bin/phpize
...
/opt/homebrew/bin
の中にはインストールされたソフトウェアの実体へのシンボリックリンクがあります。brew unlink
でこのシンボリックリンクを削除し、 brew link
でシンボリックリンクを張ります。
私たちは、このPATHの通った/opt/homebrew/bin
のシンボリックリンクを介してコマンドを実行しています。なので、シンボリックリンクを張り直すことでバージョンの切り替えができるのです。わーすごい。
プログラミングの独学に行き詰まっていませんか?誰かに相談したい、もっと効率よく学びたいなら、プログラミングスクールを検討してみてください。
PHP-FPMの切り替え
PHP-FPM を使っている場合はこれも切り替えます。
上記PHPコマンドの切り替えで /opt/homebrew/sbin/php-fpm
のリンク先も切り替えられています。あとは php-fpm デーモンを再起動するだけです。
% brew services restart php
Stopping `php`... (might take a while)
==> Successfully stopped `php` (label: homebrew.mxcl.php)
==> Successfully started `php` (label: homebrew.mxcl.php)
PHPモジュールの切り替え
ApacheモジュールのPHPを使用している場合は手動で切り替えなければなりません。Apache の設定ファイル httpd.conf
を修正します。
% vi /opt/homebrew/etc/httpd/httpd.conf
変更前
LoadModule php_module /opt/homebrew/opt/php@8.0/lib/httpd/modules/libphp.so
変更後
#LoadModule php_module /opt/homebrew/opt/php@8.0/lib/httpd/modules/libphp.so
LoadModule php7_module /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so
変更を反映させるために httpd を再起動します。
% apachectl restart
Apacheの設定ファイル修正はちょっと面倒ですよね。手作業になってしまう理由は2つあって、ひとつはHomebrewの指示通りに設定すると LoadModule は(シンボリックリンクではなく)モジュールファイルの実体を参照していること。もうひとつはPHP7とPHP8でモジュールファイルの名前が違うことです。
1つめの問題は実体ではなくシンボリックリンクを参照することで解決します。つまり、LoadModule php_module /opt/homebrew/lib/httpd/modules/libphp.so
とすればいいんです。
また、PHP8からモジュールファイルの名前が libphp.so
になったので、今後リリースされるPHPのモジュールはファイル名にバージョン番号が付かないのではないでしょうか。
PHP8以降のバージョン間の切り替えならば、Apacheの設定ファイルの修正は必要なくなりそうです。
でわでわ
プログラミングの独学に行き詰まっていませんか?誰かに相談したい、もっと効率よく学びたいなら、プログラミングスクールを検討してみてください。
コメント