Web Programmerメモ

プログラム開発のメモです

phpbrewでPHP 7.4を入れるのにいろいろつまづいた

はじめに

2019/11/28にPHP 7.4正式版がリリースされた。
https://www.php.net/releases/7_4_0.php
https://www.php.net/ChangeLog-7.php#7.4.0

Macbook AirにphpbrewでPHP 7.4をインストールするのにいろいろ苦労したので、
記録を残しておこうと思う。

手順

うまくいったのは以下の手順。

1:openssl, libxml2, pkg-config入れる

  • OpenSSLのバージョンは1.1以上にする
  • libxml2も最新版にする
  • pkg-configも入れとく
$ brew install openssl
$ brew install libxml2
$ brew install pkg-config

OSデフォルトのOpenSSLが0.9.8の場合、1.0.2をインストールしてパスを貼り替えていても、PHP 7.4インストール時に1.0.2以上が必要って怒られた。
ビルドログに沿って.bashrcにOPENSSL_CFLAGS, OPENSSL_LIBSなど設定したが、うまくいかず。

途中でopenssl 1.0.2を強制削除する暴挙をとったところ、インストール済みのphp7.3が起動できなくなり、
さらにはphpbrewも使えない、7.3をuninstallできないなどなど環境を壊してしまったので、結局phpbrewを一度綺麗に削除して最初からやり直した。。
(※教訓:brew uninstall openssl --force とかやらない)

2:oniguruma(正規表現ライブラリ)

brewでインストールする

$ brew install oniguruma

3:パスの追加

openssl, libxml2のパスを追加

export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
export PATH="/usr/local/opt/libxml2/bin:$PATH"

4:環境変数の追加

いろいろ苦労したが、以下の環境変数を追加したら7.4のビルドとインストールができた。

export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
export PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)"

source ~/.bachrc を実行して設定を反映するのを忘れずに。

4:PHP 7.4をインストール

phpbrewでPHP 7.4をインストール

$ phpbrew update
$ phpbrew known
Read local release list (last update: 2019-11-29 12:36:17 UTC).
You can run `phpbrew update` or `phpbrew known --update` to get a newer release list.
7.4: 7.4.0 ...
7.3: 7.3.12, 7.3.11, 7.3.10, 7.3.9, 7.3.8, 7.3.7, 7.3.6, 7.3.5 ...
7.2: 7.2.25, 7.2.24, 7.2.23, 7.2.22, 7.2.21, 7.2.20, 7.2.19, 7.2.18 ...
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, 7.0.31, 7.0.30, 7.0.29, 7.0.28, 7.0.27, 7.0.26 ...
5.6: 5.6.40, 5.6.39, 5.6.38, 5.6.37, 5.6.36, 5.6.35, 5.6.34, 5.6.33 ...
5.5: 5.5.38, 5.5.37, 5.5.36, 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31 ...
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...

$ phpbrew install 7.4.0 +default

バージョン切り替え

$ phpbrew switch php-7.4.0
$ php -v
PHP 7.4.0 (cli) (built: Dec  1 2019 01:39:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

めでたしめでたし!  
 
 
 
 
 


※以下余談

以上、あっさり書いたけど、何かとインストールには苦労した。

インストール途中でいろいろつまづいたこと

元々OpenSSLはバージョン1.0.2rをインストールしていたのだが、
phpbrewでPHP 7.4をインストールすると今までに見たことないエラーが・・・

$ phpbrew install 7.4.0 +default

Error: Configure failed:
The last 5 lines in the log file:
installed software in a non-standard prefix.

Alternatively, you may set the environment variables OPENSSL_CFLAGS

and OPENSSL_LIBS to avoid the need to call pkg-config.

See the pkg-config man page for more details.

ググってみたところGithubのissueのページがヒット。

github.com

phpbrewのバグみたいなことが書かれているが、
ビルドログに出た内容を対策していけばなんとかならんかと。

OpenSSL

ビルドログを見たところ以下のようなメッセージが出力されていた。

checking for openssl >= 1.0.1... no
configure: error: Package requirements (openssl >= 1.0.1) were not met:

Requested 'openssl >= 1.0.1' but version of OpenSSL is 0.9.8zg

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables OPENSSL_CFLAGS
and OPENSSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

いやいや、たしかにOpenSSLはOSデフォルトは0.9.8だが、今は1.0.2を入れてパスも通しているし。

$ openssl version
OpenSSL 1.0.2r  26 Feb 2019
$ which openssl
/usr/local/opt/openssl/bin/openssl

デフォルトで入っていたOpenSSLは以下。

$ /usr/bin/openssl version
OpenSSL 0.9.8zg 14 July 2015

ということなので Package requirements (openssl >= 1.0.1) were not met: なエラー出ても困る。
ログに出ている通り、OPENSSL_CFLAGSとOPENSSL_LIBSを設定すればいいんかなと。

~/.bashrc

export OPENSSL_CFLAGS=-I/usr/local/opt/openssl/include
export OPENSSL_LIBS=-L/usr/local/opt/openssl/lib

を追記して、 source ~/.bashrc で反映。 再びPHP 7.4をインストールする。

$ phpbrew install 7.4.0 +default

Error: Configure failed:
The last 5 lines in the log file:
installed software in a non-standard prefix.

Alternatively, you may set the environment variables ONIG_CFLAGS
and ONIG_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

今度は違うエラー。。ONIG ??ってなんだ?
ググってみたところ、onigurumaという正規表現ライブラリに関するものらしい。

↓の記事を見ている限りだと、onigurumaが今まで同梱されていたものが7.4から外部ライブラリ参照に変わった様子。(裏付け確認はしてない)

tekitoh-memdhoi.info

onigurumaインストール

これはbrewであっさりインストールできる。

$ brew install oniguruma

それにしても鬼車って名前いいな。

再びPHP 7.4をインストール開始したところ、今度はビルドが始まりそこそこ時間がかかり始めた。
これはうまくいくだろうと思い、うちの子を公園に連れて行くために小一時間ほど外出。

そして帰ってきて見ると、、

$ phpbrew install 7.4.0 +default

Error: Make failed:
The last 5 lines in the log file:
      _php_openssl_capture_peer_certs in xp_ssl.o

      ...

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sapi/cli/php] Error 1

インストールできてないし、またみたことないエラーが。 ググって見たけどよくわからん。

途中、libxml2を更新してみたところ同時にOpenSSLが1.1に更新されたのだが事象は改善せず。
何かの記事でopensslを再インストールするとよい、みたいなのをちらっと見かけたので、 前述のbrew uninstall openssl --forceとかやってしまったところ、 phpが実行できなくなってしまい詰んだ。

$ phpbrew install 7.4.0 +default
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
  Referenced from: /Users/gayou/.phpbrew/php/php-7.3.3/bin/php
  Reason: image not found
Trace/BPT trap: 5

こうなるともうどうしようもなくなったので、
phpbrewを一度綺麗に削除してインストールし直す。

もう一度最初からphp 7.4をインストールしようとしたが、それでもエラーが発生。
ビルドログに以下のような情報が出ていたので、

 _php_openssl_capture_peer_certs in xp_ssl.o
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Warning: Refusing to link macOS-provided software: openssl@1.1
If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

For pkg-config to find openssl@1.1 you may need to set:
  export PKG_CONFIG_PATH=/usr/local/opt/openssl@1.1/lib/pkgconfig

ログに書いているようにパスの設定や環境変数を設定しておくと、
PHP 7.4を無事にインストールすることができた。