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 が必要です。
そこで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
これでうまくいった。
参考文献
以下はお世話になった記事、ドキュメントの紹介。
- Ubuntu22.04でphpenv使おうと思ったらopensslのバージョン違いでbuildできない件 #PHP - Qiita
- FIX nothing below PHP 8.1 installs in Ubuntu 22.04 (
RSA_SSLV23_PADDING
undeclared in OpenSSL 3.0.0) · Issue #718 · php-build/php-build - Ubuntu22.04でphpenv使おうと思ったらopensslのバージョン違いでbuildできない件 #PHP - Qiita
- MacにPHPのインストールをする
- PHP: 要件 - Manual
- php-build/bin/php-build at master · php-build/php-build