個人で色々試したいものがある時に最新のPHPが必要となる事が多々あります。そんな時、今まではHomebrewで両方のversionをインストールして環境変数のパスを手作業で切り替えていましたが、正直面倒です。今回はPHPBrewを使ってそんな面倒が解消されるか試してみます。今回の記事は私の作業環境であるmacOSでの話となります、ご承知ください。

PHPBrew

前々からPHPBrew自体は知っていましたが、ローカルには既にHomeBrewで複数のversionがインストールされていいた為、試してはいませんでした。今回、Laravel10.xのインストールを試すのにPHP8.1以上が必須となった為、そちらのインストールに使用してみます。

READMEに書いてありますが、PHPBrewは異なるPHPのversionをホームディレクトリ配下(macだと~/.phpbrew/php配下)にビルドしインストールするツールです。PHPBrewはバージョン毎にディレクトリを分けてインストールする為、それぞれが独立しており、管理や使用するバージョンの切り替えが容易となる様です。恐らくバージョン切り替え時は単に参照のパスを書き換えているのでしょうね。これは期待大です。

OSのサポート

PHPBrewはUnix系のOSでサポートされているようです。今回紹介するのはmacOSでの手順ですが、他にもLinuxのディストリビューション(Ubuntu, Debian, RHEL, Fedoraなど)でも使えるようです。

install

早速、試してみましょう。まず、install前にRequirementから各OSごとに事前にinstallが必要なパッケージ等が書いてあるのでチェックします。macOSの場合はHomebrewが必要との事でした。私の環境には既にinstallされているので飛ばします。

次にcurlでphpbrewをダウンロードし、/usr/local/bin配下に配置します。

curl -L -O https://github.com/phpbrew/phpbrew/releases/latest/download/phpbrew.phar

# chmodで実行権限を付ける
chmod +x phpbrew.phar

# /usr/local/bin 配下にphpbrewとして設置
mv phpbrew.phar /usr/local/bin/phpbrew

/usr/local/bin配下はパスが通っているので、以下のようにどこからでも呼び出せるようになったはずです。

which phpbrew
>>> /usr/local/bin/phpbrew

次に、phpbrewを初期化します。

phpbrew init

初期化が完了すると $HOME/.phpbrew 配下に必要なファイルが生成されます。

ls ~/.phpbrew
>>> bashrc          build           php             phpbrew.fish

Terminal起動時に必要な機能を読み込ませる為に、.bashrc または .zshrc に以下の行を追記します。(私の環境では.zshrcに追記した)

[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc

追記後にsourceコマンドで.zshrcから設定を読み直しましょう。

source ~/.zshrc

最後にライブラリ探索用のプレフィックスをセットしてinstall完了です。これをセットしないとライブラリが見つからない旨のエラーが沢山出てしまいます。

phpbrew lookup-prefix homebrew

PHPbrewを使ってPHPをインストール

phpbrewの準備ができたところで任意のVersionのPHPをインストールしてみましょう。今回はPHP8.1をインストールします。まず、インストール可能なPHPのバージョンを確認します。

phpbrew known
>>>===> Fetching release list...
Downloading https://www.php.net/releases/index.php?json=1&version=8&max=100 via curl extension
Downloading https://www.php.net/releases/index.php?json=1&version=7&max=100 via curl extension
8.2: 8.2.7, 8.2.6, 8.2.5, 8.2.4, 8.2.3, 8.2.2, 8.2.1, 8.2.0 ...
8.1: 8.1.20, 8.1.19, 8.1.18, 8.1.17, 8.1.16, 8.1.15, 8.1.14, 8.1.13 ...
8.0: 8.0.29, 8.0.28, 8.0.27, 8.0.26, 8.0.25, 8.0.24, 8.0.23, 8.0.22 ...
7.4: 7.4.33, 7.4.32, 7.4.30, 7.4.29, 7.4.28, 7.4.27, 7.4.26, 7.4.25 ...
7.3: 7.3.33, 7.3.32, 7.3.31, 7.3.30, 7.3.29, 7.3.28, 7.3.27, 7.3.26 ...
7.2: 7.2.34, 7.2.33, 7.2.32, 7.2.31, 7.2.30, 7.2.29, 7.2.28, 7.2.27 ...
7.1: 7.1.33, 7.1.32, 7.1.31, 7.1.30, 7.1.29, 7.1.28, 7.1.27, 7.1.26 ...
7.0: 7.0.33, 7.0.32 ...

最新は8.2までありますね、古いバージョンは7.0まで指定できる様です。インストール可能なリストに8.1も含まれているので、次のコマンドでインストールします。ビルドに時間が掛かるようで、私の環境では15分ほど掛かりました。

phpbrew install 8.1 +default +dbs +apxs2

8.1の最新のバージョンをインストールしたいので、マイナバージョン(8.1.XのX部分)は指定しませんでした。
Versionの後に指定している+default +dbs +apxs2というのはバリアントと呼ばれるものです。

バリアント

バリアントとは、通常のPHPをビルド・インストール際に指定するオプションを抽象化したものです。DBのドライバであったり、opensslなどのライブラリであったり、PHPで有効にしたい機能をオプションとして指定できます。バリアント無しだと最小構成でインストールされます。+defaultだとよく使われるバリアントがまとめてインストールされます。また、今回のインストールではDB(mysql)を使用する為の+dbs、Apache2を使用する為の+apxs2を追加で指定しました。以下のコマンドで、指定可能なバリアントが確認できます。

phpbrew variants
>>>
Variants: 
  all, apxs2, bcmath, bz2, calendar, cgi, cli, ctype, curl, dba, debug, dom, 
  dtrace, editline, embed, exif, fileinfo, filter, fpm, ftp, gcov, gd, 
  gettext, gmp, hash, iconv, imap, inifile, inline, intl, ipc, ipv6, json, 
  kerberos, ldap, libgcc, mbregex, mbstring, mcrypt, mhash, mysql, opcache, 
  openssl, pcntl, pcre, pdo, pear, pgsql, phar, phpdbg, posix, readline, 
  session, soap, sockets, sodium, sqlite, static, tidy, tokenizer, wddx, 
  xml, xmlrpc, zip, zlib, zts


Virtual variants: 
  dbs: sqlite, mysql, pgsql, pdo
  mb: mbstring, mbregex
  neutral: 
  small: bz2, cli, dom, filter, ipc, json, mbregex, mbstring, pcre, phar, 
  posix, readline, xml, curl, openssl
  default: bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc, 
  json, mbregex, mbstring, mhash, pcntl, pcre, pdo, pear, phar, posix, 
  readline, sockets, tokenizer, xml, curl, openssl, zip
  everything: dba, ipv6, dom, calendar, wddx, static, inifile, inline, cli, 
  ftp, filter, gcov, zts, json, hash, exif, mbstring, mbregex, libgcc, 
  pdo, posix, embed, sockets, debug, phpdbg, zip, bcmath, fileinfo, ctype, 
  cgi, soap, pcntl, phar, session, tokenizer, opcache, imap, ldap, tidy, 
  kerberos, xmlrpc, fpm, dtrace, pcre, mhash, mcrypt, zlib, curl, readline, 
  editline, gd, intl, sodium, openssl, mysql, sqlite, pgsql, xml, gettext, 
  iconv, bz2, ipc, gmp, pear

+defaultには以下が含まれている様です、

default: bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc, 
  json, mbregex, mbstring, mhash, pcntl, pcre, pdo, pear, phar, posix, 
  readline, sockets, tokenizer, xml, curl, openssl, zip

話をインストールに戻します。installコマンドが完了したらlistコマンドでインストール済みのバージョン一覧に表示されるか確認しましょう。

phpbrew list
>>>
* (system)
  php-8.1.20

アスタリスク(*)が付いているのが現在使用中のバージョンです。(system)はHomebrewでインストールしたシステムデフォルトのバージョン(8.0.28がインストールされています)の事です。PHPBrewによって php-8.1.20 がインストールされた様ですね。このバージョンに切り替えるにはuseコマンドで指定します。

phpbrew use php-8.1.20

バージョンが切り替わったか、確認してみましょう。

php -v
>>>
PHP 8.1.20 (cli) (built: Jun 20 2023 21:18:43) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.20, Copyright (c) Zend Technologies

8.1.20 になりましたね。尚、このままでは一度Terminalを再起動するとまたシステムデフォルトの8.0.28に戻ってしまいます。PHPBrewでインストールしたPHPをデフォルトで使用するにはswitchコマンドで指定します。

phpbrew switch php-8.1.20

逆にPHPBrewの使用をやめてシステムデフォルトに戻したい場合は

phpbrew switch-off

それまでに使用していた環境も残しつつ、別バージョンをインストールして試せるのは安心感があって良いですね。

まとめ

以上、PHPBrewのインストールから基本的な操作の解説でした。Homebrewでも複数のバージョンをインストールして切り替える事は可能でしたが、冒頭で書いたように手動で切り替えが必要な部分があります。最近L10.xの検証などでバージョンを切り替える頻度が多いため、コマンド一発で切り替えられるPHPBrewは重宝しそうです。

By hikaru