PHP
macos
phpenv
asdf-vm
macOSMojave

macOS Mojave 2019年版 phpenv でマルチPHP環境の導入


TL;DR

可能なら IDE なんかはシステムデフォの php で設定&利用して

アプリの実行環境には Docker を使ったほうがいいぞ!!

それでも大人の事情でホスト OS 上にマルチ PHP 環境を入れる必要がある場合は…


  • 2019年2月現在、PHPビルドのための依存パッケージのうち icu4c が最新だとPHPのビルドが通らない。


  • icu4c のバージョンを58.2に下げると通るようになる


  • icu4c のバージョンを最新に戻してしまうと composer 等の実行時にエラーが出るので brew pin icu4c しておく

phpenv からの乗り換え先として asdf-vm を推したいところですが、 icu4c のバージョンを下げても asdf のPHPプラグインではビルドが通らなかったので、 phpenv 使いましょう。


詳細


1. 依存パッケージの導入(他に必要なものがあれば適宜追加)

brew install \

re2c \
icu4c \
libxml2 \
zlib \
libjpeg \
libpng \
freetype \
gettext \
readline \
bison \
bison@2.7 \
libiconv \
opnessl \
mcrypt


2. ビルド通すために icu4c のバージョンを58.2に下げる

まずは Formula を58.2当時の状態にする。

リビジョンは git log --oneline とかで見ればすぐわかりますが、変わるもんじゃないので下記コマンドコピペでOK

brew update

cd $(brew --repo homebrew/core)/Formula/
git checkout 1ad4011e7b -- icu4c.rb

現行 brew では廃止済みの API が含まれているので、それを Formula から削る。

(※下記コマンドは gnu-sed 向けです。変更箇所は単純なので vi で直接やってもOK)

sed -i 's#if MacOS.prefer_64_bit?##g' icu4c.rb

58.2 の状態でインストールして固定

brew reinstall icu4c

brew pin icu4c

今後の brew の利用に支障をきたさないよう、 Formula のリビジョンを戻しておく

git reset --hard


3. 必要なヘッダーファイルをインストール

xcode-select --install

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /


4. php-build のビルド用環境変数を定義

これも必要なものがあれば適宜追加。

PHP環境を追加したり再ビルドするたびにコマンド先頭に書くのはツラい長さなので、 .bashrc なり .zshenv なりに追記すると楽かと。

cat <<EOC >> ~/.bashrc

php_build_configure_opts=(
"--with-freetype-dir=/usr/local/opt/freetype"
"--with-gettext=/usr/local/opt/gettext"
"--with-icu-dir=/usr/local/opt/icu4c"
"--with-jpeg-dir=/usr/local/opt/libjpeg"
"--with-png-dir=/usr/local/opt/libpng"
"--with-openssl=/usr/local/opt/openssl"
"--with-libxml-dir=/usr/local/opt/libxml2"
"--with-zlib-dir=/usr/local/opt/zlib"
"--with-readline=/usr/local/opt/readline"
"--with-iconv=shared,/usr/local/opt/iconv"
)
EOC
echo 'export PHP_BUILD_CONFIGURE_OPTS="${php_build_configure_opts[@]}"' >> ~/.bashrc
echo 'export PHP_BUILD_EXTRA_MAKE_ARGUMENTS="-j4"' >> ~/.bashrc

ここまででビルドは通るようになってると思います。

/usr/local/opt/<formula_name>$(brew --prefix <formula_name>) で取れますが、これを .bashrc 等にこんなにいっぱい書くとひどいことになるのでベタ書きでいいんじゃないかと。


5. phpenv のインストール

*env 系の常として phpenv init をREADMEの通りにやってるとシェルの起動が遅くなります。

回避するために --no-rehash をつけときましょう。

curl -L https://raw.githubusercontent.com/phpenv/phpenv-installer/master/bin/phpenv-installer | bash

echo 'eval "$(phpenv init --no-rehash -)"' >> ~/.bash_profile
exec $SHELL -l


6. PHP環境のビルド

上の手順で --no-rehash をつけてシェル起動を軽くした代わりに、バイナリを追加・変更した際は手動で rehash する必要があります。忘れずに。

phpenv install 7.3.2

phpenv rehash


備考

記事冒頭でも書いたとおり、 icu4c のバージョンをあげちゃうと composer 等が動かなくなるので注意。

また brew pin <formula> で Formula をピン留めすると、 brew upgrade 実行時に「ピン留めされた Formula を更新しなかった」という旨のメッセージが表示され、終了コードが 1 になります。

Formula は通常、依存する他の Formula も更新されることを期待して構築されます。あなたが「あえて」ピン留めした Formula が古い状態を維持していると、これに依存する他の Formula が破壊されてしまう恐れがあります。

そんな事態を防ぐためにこれがデフォルトの挙動になっているとのこと。

(参考 : https://github.com/Homebrew/brew/issues/4063

エラー終了だと都合が悪い場合は --ignore-pinned オプション付きで実行すると無視可能。


所感

実際のところ、 macOS Mojave のシステムデフォルト PHP は7.1.23 とそれなりのバージョンなので、エディタや IDE に与える実行環境としては十分です。

通常はそのままシステムの PHP を使用しつつ、特定バージョンが必要な場合は、そのアプリの実行環境を Docker で立てるなどしたほうが現代的で苦労も少なく済むんじゃないかと思います。


以上です。