Macでphpenvを使ってphp7.4.33の開発環境を構築する方法

この記事では、Macでphpenvを使ってphp7.4.33の開発環境を構築する方法を解説する。

筆者の開発環境

  • macOS 13.4.1
  • phpenv v0.9.0-rc.1
  • zsh 5.9 (x86_64-apple-darwin22.0)

phpenv php-buildのインストール

homebrewではインストールできなかったので、gitから直接インストールする。

# phpenvのインストール
git clone git@github.com:phpenv/phpenv.git ~/.phpenv
# php-buildのインストール
git clone https://github.com/php-build/php-build.git
mv php-build $HOME/.phpenv/plugins/php-build

~/.zshrcに以下を追加。

export PATH="$HOME/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

試しに以下のコマンドを実行する。

phpenv --version

php7.4.33のインストール

通常であれば以下のコマンドでphp7.4.33のインストールができる

phpenv install 7.4.33

しかし筆者の環境ではエラーが多発して上手くいかず、最終的には、以下のコマンドでインストールができた。

PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/openssl@1.1/lib/pkgconfig" PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)"  phpenv install 7.4.33

これからはこのコマンドの解説をする。

PHP_BUILD_CONFIGURE_OPTS を指定してビルド時にパッケージを見つけれる様にする。

単純にphpenv install 7.4.33を実行すると以下のエラーが出た。

-----------------------------------------
expr: not a decimal number: '12-4996'
configure: error: Please reinstall the BZip2 distribution
-----------------------------------------

上記のエラーはBZip2というパッケージが存在しないと言う物だが、実際はすでにインストールされている

$ brew --prefix bzip2
/usr/local/opt/bzip2

つまり、phpのビルド時にbzip2を見つからないのが原因なので、phpenv install時に環境変数を設定してあげないといけない。

PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)"  phpenv install 7.4.33

PHP_BUILD_CONFIGURE_OPTSを設定することでPHPのconfigureのオプションを追加することができる。 (configureとはphpのビルド時に使われているシェルスクリプトのこと)

ついでに--with-iconvも設定した。

OpenSSL1.1をインストールし、ビルド可能にする。

再度phpenvを実行したところ、以下のエラーが発生した。

/usr/local/Cellar/openssl@3/3.3.0/include/openssl/dh.h:211:1: note: 'DH_free' has been explicitly marked deprecated here
OSSL_DEPRECATEDIN_3_0 void DH_free(DH *dh);

要はOpenSSLのビルドでエラーが発生したわけだが、原因は適切なOpenSSLのバージョンを用意していなかった ことにある。

筆者の環境ではOpenSSL3.3が入っていたが、php7.4の場合はOpenSSLが1.0.1 ~ 3.0でなければいけない。

OpenSSL 関数を使用するためには、» OpenSSL ライブラリをインストールする必要があります。 PHP 7.0 の場合、 OpenSSL >= 0.9.8 かつ < 1.2 が必要です。 PHP 7.1-8.0 の場合、OpenSSL >= 1.0.1 かつ < 3.0 が必要です。 PHP >= 8.1 の場合、OpenSSL >= 1.0.2 かつ < 4.0 が必要です。

引用:PHP: 要件 - Manual

そこでOpenSSL1.1を3.3と共存する形で入れる。そのためには以下のコマンドを実行する。

brew install openssl@1.1

これで3.3と1.1が共存する形で入った。 改めてコマンドを実行するがPKG_CONFIG_PATHを設定してOpenSSL1.1の場所をビルド時に教えてあげればよい。

PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/openssl@1.1/lib/pkgconfig" PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)"  phpenv install 7.4.33

これでうまくいった。

参考文献

以下はお世話になった記事、ドキュメントの紹介。