3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

macOS MojavにPHP-5.6.xをインストール

Last updated at Posted at 2019-12-29

結論

結論を先にいいます、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

課題

  1. ローカルに古いバージョンのopensslのない場合、opensslの古いブランチをcheckoutして、自炊?いや、macportsのほうがはやいでしょう、でもbrewのopensslと同時に存在する、変なトラブルないかな?やっぱりlinuxが開発環境に向いているかもしれません。
  2. 今回古いシステムに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

3
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?