結論
結論を先にいいます、Linuxでやったほうが良いです。
どうしでも、MacOSでやりたい場合、ログの最後をご参照ください。
#解決方法のショットバージョン
##opensslの古いバージョンにスイッチ
###ローカルにある古いバージョン(1.0系)のopensslを確認
古いバージョンのPHPは、古いバージョンのopensslに依存しているため、古いバージョンのopensslが必要です。
セキュリティーのため、Homebrewの公式サイトのから1.0系のopensslフォミュラーが削除されたので、Homebrewからインストールは不可になっています。ローカルに古いバージョンのopensslが残っていれば、それを使ってPHPのインストールできます。残っていなかれば、Githubから直接インストールできます。
ls -al /usr/local/Cellar/openssl*
Homebrewのパッケージをインストールするたびに、自動にパッケージを更新されます。opensslも含めます。または、利用されていない古いパッケージを自動的に削除されます。自分の場合、この2つを無効にしています。つまり手動で管理しています。
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALL_CLEANUP=1
opensslの古いバージョンをインストール(直接Githubからインストール、バージョン:1.0.2t)
Homebrew 2.5.0からGithubから直接インストールする機能が削除されたので、一旦2.3.0に戻す:
https://stackoverflow.com/a/64215101/2671489
brew reinstall https://raw.githubusercontent.com/Homebrew/homebrew-core/64555220bfbf4a25598523c2e4d3a232560eaad7/Formula/openssl.rb
###opensslのバージョンスイッチ
brew switch openssl 1.0.2t
opensslバージョン指定して、インストール
$ CONFIGURE_OPTS="--with-openssl=/usr/local/Cellar/openssl/1.0.2t" phpenv install 5.6.30
事件の時系列ログ(5.6.30):
1. 古いシステム(PHP-5.6.40)をメンテナンスしていますですが、ローカルからデプロイしたところ、いつも動いているはずのデプロイツールdep が動けなくなりました(2019年12月の下旬に)。
2. php -v
したら、エラー発生。
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
3. いつの間に、phpがこけた、しかも、openssl関連、そういえば、最近brew update & brew upgrade
を実行したなあ、それと関係あるかもしれません。
4. openssl version
でopensslを確認したら、OpenSSL 1.1.1d 10 Sep 2019
、もう1.1になっている、上のエラーの1.0.0とお異なります、古いopensslを参照しているので、これがエラーの原因かな。
5. では、PHP7.4は、恐らく最近のopensslを対応しているはずので、インストールして、同じ現象は無いはずです、phpenv install 7.4.0
をインストールしてみたら、別のエラーCannot find libz
。
6. むかしMojavにupgradeしたときに、見たことあります、Xcodeが更新したら、Command Line Toolsがコケて、コンパイルエラー、macOS_SDK_headers_for_macOS_10.14.pkgを再インストールすれば、解決できます。
7. 探したら、macOS_SDK_headers_for_macOS_10.14.pkgが見つからない、どこにあるだろう、削除されたかな、困る。
8. Command Line Toolsを再度インストールしたら、入手できる情報があったので、xcode-select --install
したら、あれ、既にインストールされている。
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
9. 調べたところ、削除して再インストールできる、実行したら、無事にmacOS_SDK_headers_for_macOS_10.14.pkgがインストールされたので、PHP7.4を再度インストールしたら、無事にできました。php -v
したら、同じようなopensslエラーはありません、新しいPHPは最近のopensslを対応できている。
$ sudo rm -rf /Library/Developer/CommandLineTools
10. では、古いバージョンのPHPは最近の最新のopensslを対応しているか、それを検証するために、古いPHPを削除して、再度インストールしてみます。実行したら、やっぱりopensslのエラーです、しかも、structのことで、バージョンの違いで、データの構造が変わったようです。
/var/tmp/php-build/source/5.6.30/ext/openssl/openssl.c:3560:9: error: incomplete definition of type 'struct dsa_st'
11. 古いopensslに戻ったら、できるかもしれません、brew search openssl@1.0
したら、削除された!!!openssl.orgで調べてみたら、確かにformulaが削除されたようです。バージョン1.1しかない。
Remove OpenSSL 1.0 (https://github.com/Homebrew/homebrew-core/pull/46876)
12. ここ迄来ると、かなり時間もとられました。はやくデプロイしたいので、残りの道は3つです。
a. このままmacで解決する、次になんのトラブル出るかわかりません。
b. mac関連のコンパイルエラーですので、linuxでやったら、できる気がします。
c. dockerのphpもありますので、それでやる。dockerの環境問題がハマるときに、本当にハマるので、若干怖い。
---> 即断でbを選びました、ubuntuで環境作って、無事にデプロイしました。
13. 次の朝、macOSをなんとかしたい、phpenv install 5.6.30
をopensslの古いバージョン指定して、インストールできるじゃなかと、探したら、お!できる。with-openssl
を使うということで。問題は古いバージョンはopensslをどうやってインストールだ。brewにもないので、別系のmacportsでやるか、探したら、確かにある、もでローカルに古いバージョンのopensslないので、探したら、本当にあった、そして、macportsでインストールしたら、無事にできました。
$ CONFIGURE_OPTS="--with-openssl=/usr/local/Cellar/openssl/1.0.2r" phpenv install 5.6.30
課題
- ローカルに古いバージョンのopensslのない場合、opensslの古いブランチをcheckoutして、自炊?いや、macportsのほうがはやいでしょう、でもbrewのopensslと同時に存在する、変なトラブルないかな?やっぱりlinuxが開発環境に向いているかもしれません。
- 今回古いシステムにdocker化していないので、dockerで試していないが、できる気がします。
xcode CommandLineToolsの再インストール方法
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
# FROM_THE_FUTURE: 2020/06/06
# phpの7.3.12をインストールで、上記手順だけで足りない場合、あるので、以下の手順を追加して、インストール出来ました。
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
installer: Package name is macOS_SDK_headers_for_macOS_10.14
opensslのバージョンスイッチ
既存のopensslバージョンを確認
ls -al /usr/local/Cellar/openssl*
バージョンスイッチ
brew switch openssl 1.0.2r
参考情報
https://polidog.jp/2018/11/28/mojave_phpenv/
https://qiita.com/DQNEO/items/49d6c093886d6b7b6cc1
https://qiita.com/rrj-ueyama/items/07e6c6f6bd78fd6c2d15