はじめに
Python や Node.js はバージョン管理を行っているのですが PHP ではしたことないなと思い、軽い気持ちで mac に phpenv / phpbuild を使ってみようと手を出したのですが、これが結構苦労しました、、、
主にエラーの原因は2点上げられました。
- 依存関係のあるパッケージの未インストール
- PHP インストール時のコンパイルオプション指定の不十分
1つ目は ソースからコンパイル・ビルドすると良く起こる問題で yum や apt で依存関係を解決する経験は何度もあったので、mac 環境であれば homebrew
を使って必要なパッケージを入れてあげます。
問題は 2つ目です。
phpenv も内部的にはソースを落としてコンパイル・ビルドをしています。
ソースを落として ./configure
されたことがある方はピンと来るかもしれませんが、依存関係のあるパッケージのパスをオプションで指定しないとコンパイラ側が認識できない場合があります。
実際に、下記のようなエラーに遭遇するのではないかと思います。
1$ phpenv install 3.7.17
2
3~~略~~
4
5-----------------
6| BUILD ERROR |
7-----------------
8
9Here are the last 10 lines from the log:
10
11-----------------------------------------
12configure: error: Cannot find zlib
13-----------------------------------------
14
15The full Log is available at '/tmp/php-build.7.3.17.20200417135632.log'.
16[Warn]: Aborting build.
zlib
は入れてるのに何故かエラーになってしまう。
エラーそのままに phpenv 側が zlib を発見できていないので、オプションを追加してパス指定して上げる必要があります。
また、このようなエラーは他の依存関係でも同様に起こりえます。
環境
- macOS Catalina 10.15.4
- zsh 5.7.1
- php 7.3.17 をインストール
手順
依存関係のインストール
1# あくまでも私の環境で必要とされたパッケージです
2
3$ brew update
4$ brew install \
5 krb5 \
6 openssl \
7 re2c \
8 bison@2.7 \
9 libxml2 \
10 zlib \
11 BZip2 \
12 libiconv \
13 libedit \
14 tidy-html5 \
15 libzip;
default_configure_options にオプション追加
phpenv ではインストール時のコマンドオプションが default_configure_options
と言うファイルで管理されています。
なるべく不要なオプションをコマンドに載せたくない身としては、同ファイルで依存パッケージのパスを指定しています。
初期状態
1$ cat ~/.phpenv/plugins/php-build/share/php-build/default_configure_options
2--enable-sockets
3--enable-exif
4--with-zlib
5--with-zlib-dir=/usr
6--with-bz2
7--enable-intl
8--with-kerberos
9--with-openssl
10--enable-soap
11--enable-xmlreader
12--with-xsl
13--enable-ftp
14--enable-cgi
15--with-curl=/usr
16--with-tidy
17--with-xmlrpc
18--enable-sysvsem
19--enable-sysvshm
20--enable-shmop
21--with-mysqli=mysqlnd
22--with-pdo-mysql=mysqlnd
23--with-pdo-sqlite
24--enable-pcntl
25--with-readline
26--enable-mbstring
27--disable-debug
28--enable-fpm
29--enable-bcmath
30--enable-phpdbg
変更後
1cat ~/.phpenv/plugins/php-build/share/php-build/default_configure_options
2--enable-sockets
3--enable-exif
4--with-zlib
5--with-zlib-dir=/usr/local/opt/zlib
6--with-bz2=/usr/local/opt/bzip2
7--enable-intl
8--with-kerberos
9--with-openssl
10--enable-soap
11--enable-xmlreader
12--with-xsl
13--enable-ftp
14--enable-cgi
15--with-curl=/usr
16--with-tidy=/usr/local/opt/tidy-html5
17--with-xmlrpc
18--enable-sysvsem
19--enable-sysvshm
20--enable-shmop
21--with-mysqli=mysqlnd
22--with-pdo-mysql=mysqlnd
23--with-pdo-sqlite
24--enable-pcntl
25--with-readline
26--enable-mbstring
27--disable-debug
28--enable-fpm
29--enable-bcmath
30--enable-phpdbg
31--with-iconv=/usr/local/opt/libiconv
32--with-libedit=/usr/local/opt/libedit
33--with-libzip=/usr/local/opt/libzip
libedit だけは PHP_BUILD_CONFIGURE_OPTS でオプション追加
libedit は default_configure_options でパスを追加してもエラーになってしまいます。
1-----------------
2| BUILD ERROR |
3-----------------
4
5Here are the last 10 lines from the log:
6
7-----------------------------------------
8configure: error: Please reinstall libedit - I cannot find readline.h
9-----------------------------------------
10
11The full Log is available at '/tmp/php-build.7.3.17.20200418144551.log'.
12[Warn]: Aborting build.
どうもこちらの方の記事を参考にすると php-build 側で default_configure_options より build 時のソース側の処理で --without-libedit
が上書きされてパス指定が消されるようです。
build 処理を直接変更しても良さそうですが何が起きるか分からないので、今回は PHP_BUILD_CONFIGURE_OPTS
でコマンド上でパス指定を追加してあげます。
1$ PHP_BUILD_CONFIGURE_OPTS="--with-libedit=$(brew --prefix libedit)" phpenv install 7.3.17
おわりに
pyenv に比べて若干です、若干ですが、めんどくさいです。
有志の方が無料で作っているツールを使っといて何言ってんだなのですが、、、
また、phpenv は ruby の rbenv をベースに作られているようで、rbenv とのバージョン干渉が起きるらしく、実際に私の方でもおかしな挙動を示すときがあります。
そこらへんの問題は気にしたくない方は、phpbrew を選択するのが無難かもしれないです。
問題なくバージョン管理自体はできているのですが、ちょっとした後悔です。